CPP 共享库的创建与使用
Qusetion: 大量开源软件如何有效为己所用,站在巨人的肩膀上,前提有两个,即理解开源库的结构与信息传递, MTT(message Transform &  Transfer ); 同时如何有效使用也是需要解决的问题。
Example: 

libBondGraph作为库的使用
* 生成库

*******************************************************************************
e_minimum_required(VERSION 2.4)

project (LIBBONDGRAPH)
set(LIBBONDGRAPH_VERSION 1.0.0)

set( CMAKE_VERBOSE_MAKEFILE ON )

option( USE_RKF "Build the project using Runge-Kutta Fehlberg" OFF )
option( USE_RKFVS "Build the project using Runge-Kutta Fehlberg integration methods with variable time step" OFF )
option( DEBUG_EQN "Build the project and enable equation debugging output" OFF )
option( DEBUG_STATEEQN "Build the project and enable equation debugging output" OFF )

set( PROJECTSROOT ${CMAKE_SOURCE_DIR} CACHE PATH "Path to the root of the sources for all subproject" )

set( PACCSOURCE ${PROJECTSROOT}/PACC CACHE PATH "PACC headers" )
set( PACCBUILD ${PROJECTSROOT}/PACC/build CACHE PATH "PACC build"  )

set( SIMULATIONSOURCE ${PROJECTSROOT}/Source/Simulation CACHE PATH "Simulation headers" )

if( USE_RKF )
    if( USE_RKFVS )
        add_definitions(-DUSE_RKFVS)
    else( USE_RKFVS )
        add_definitions(-DUSE_RKF)
    endif( USE_RKFVS )
endif( USE_RKF )

if( DEBUG_EQN )
    add_definitions(-DDEBUG_EQN)
endif( DEBUG_EQN )

if( DEBUG_STATEEQN )
    add_definitions(-DDEBUG_STATEEQN)
endif( DEBUG_STATEEQN )

add_subdirectory (Source)
add_subdirectory (Examples)
*******************************************************************************

set( CMAKE_CXX_FLAGS -fvisibility-inlines-hidden )

set( BONDGRAPH_INCLUDE_DIR ${PROJECTSROOT}/Source/libBondGraph CACHE PATH "libBondGraph headers" )
set( BONDGRAPH_LIB_DIR ${PROJECTSROOT}/build/Source/libBondGraph CACHE PATH "libBondGraph build"  )

option( WITH_GSL "Build the project using GNU Scientific Library" ON )
if( WITH_GSL )
    set(GSL_DIR "$ENV{HOME}/local")
    set(GSL_INCLUDE_DIR "${GSL_DIR}/include")
    set(GSL_LIB_DIR "${GSL_DIR}/lib")
    add_definitions(-DHAVE_GSL)
    set( PACC_LIBS  gsl gslcblas)
    link_directories( ${GSL_LIB_DIR} )
    include_directories( ${GSL_INCLUDE_DIR} )
endif( WITH_GSL )


include_directories( $ENV{HOME}/local/include /sw/include ${BONDGRAPH_INCLUDE_DIR} ${PACCSOURCE} ${SIMULATIONSOURCE} )
link_directories( $ENV{HOME}/local/lib /sw/lib ${BONDGRAPH_LIB_DIR} ${PACCBUILD} )

set( Examples_LIBS pacc ${PACC_LIBS} BondGraph graph gvc m)

set ( Example1_SRCS
    Example1.cpp
)

set ( Example2_SRCS
    Example2.cpp
)

set ( Example3_SRCS
    Example3.cpp
)

set ( DCDCBoost_SRCS
    DCDCBoostMain.cpp
    DCDCBoostLookaheadController.cpp
    LookaheadController.cpp
    SimulationCase.cpp
)


add_executable (Example1 ${Example1_SRCS} )
target_link_libraries(Example1 ${Examples_LIBS})

add_executable (Example2 ${Example2_SRCS} )
target_link_libraries(Example2 ${Examples_LIBS})

add_executable (Example3 ${Example3_SRCS} )
target_link_libraries(Example3 ${Examples_LIBS})

add_executable (DCDCBoost ${DCDCBoost_SRCS} )
target_link_libraries(DCDCBoost ${Examples_LIBS})

_______________________________________________________________________________


if(COMMAND cmake_policy)
           cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)


project(PACC C CXX)
set(PACC_VERSION 1.2.1)

set( CMAKE_VERBOSE_MAKEFILE ON )

option( WITH_GSL "Build the project using GNU Scientific Library" ON )
if( WITH_GSL )
    set(GSL_DIR "$ENV{HOME}/local")
    set(GSL_INCLUDE_DIR "${GSL_DIR}/include")
    set(GSL_LIB_DIR "${GSL_DIR}/lib")
    add_definitions(-DHAVE_GSL)
    set( PACC_LIBS  gsl gslcblas)
    link_directories( ${GSL_LIB_DIR} )
    include_directories( ${GSL_INCLUDE_DIR} )
endif( WITH_GSL )


file(GLOB_RECURSE PACC_SRC  PACC/*.cpp)
file(REMOVE_RECURSE PACC_SRC  PACC/SVG/*.cpp)

file(GLOB PACC_HEADERS         PACC/*.hpp)
file(REMOVE_RECURSE PACC_HEADERS         PACC/SVG/*.hpp)
file(REMOVE PACC_HEADERS         PACC/SVG.hpp)

file(GLOB PACC_MATH_HEADERS PACC/Math/*.hpp)
file(GLOB PACC_UTIL_HEADERS PACC/Util/*.hpp)
file(GLOB PACC_XML_HEADERS   PACC/XML/*.hpp)
file(GLOB PACC_SOCKET_HEADERS PACC/Socket/*.hpp)
file(GLOB PACC_THREADING_HEADERS PACC/Threading/*.hpp)

# Include headers required
include_directories(${CMAKE_HOME_DIRECTORY})

add_library(pacc SHARED ${PACC_SRC}) //注意生成共享动态库
add_dependencies(pacc pthread ${PACC_LIBS} )
target_link_libraries(pacc pthread ${PACC_LIBS})
set_target_properties(pacc PROPERTIES VERSION ${PACC_VERSION})
set_target_properties(pacc PROPERTIES LINKER_LANGUAGE CXX)


# Install dependencies
install(FILES ${PACC_HEADERS} DESTINATION include/PACC)
install(FILES ${PACC_MATH_HEADERS} DESTINATION include/PACC/Math)
install(FILES ${PACC_UTIL_HEADERS} DESTINATION include/PACC/Util)
install(FILES ${PACC_XML_HEADERS} DESTINATION include/PACC/XML)
install(FILES ${PACC_SOCKET_HEADERS} DESTINATION include/PACC/Socket)
install(FILES ${PACC_THREADING_HEADERS} DESTINATION include/PACC/Threading)

# Install targets
install(TARGETS pacc    DESTINATION lib)


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

** 安装库
 build, sudo make install
* 使用库
** 确定头文件路径
-I /usr/
** 库链接
 sudo ln -s /usr/local/lib/libpacc.so.1.2.1 /usr/lib

ldd outTestlibPACC 
    linux-vdso.so.1 (0x00007fff8eff6000)
    libpacc.so.1.2.1 => /lib/libpacc.so.1.2.1 (0x00007f2763691000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f27634af000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2763494000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f27632a2000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f276327f000)
    libgsl.so.23 => /lib/x86_64-linux-gnu/libgsl.so.23 (0x00007f2763003000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2762eb2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2763776000)
    libgslcblas.so.0 => /lib/x86_64-linux-gnu/libgslcblas.so.0 (0x00007f2762e70000)
** 使用
g++ -o outTestlibPACC paccEnvTest1.cpp -I /usr/local/include -lpacc -std=c++11

Principle:
生成库放到适当的位置,系统要能找到, 缺省的放到了 /usr/local/include/pacc, /usr/local/lib/ 
系统使用的位置 -I /usr/lib
 sudo ln -s /usr/local/lib/libpacc.so.1.2.1 /usr/lib,生成链接更好用。
* 知识点 系统库路径 /usr/lib 或 /lib, ldd 用于查看执行文件所需库的状况
Action:---
Modify:---
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

LVYsince2021/LVYGrail/implStudio$ g++ -o outhello hello-world.c -I /usr/local/include/event2/ -levent -levent_core -levent_extra -levent_pthreads
hello-world.c: In function ‘void listener_cb(evconnlistener*, int, sockaddr*, int, void*)’:
hello-world.c:92:28: error: invalid conversion from ‘void*’ to ‘event_base*’ [-fpermissive]
   92 |  struct event_base *base = user_data;
      |                            ^~~~~~~~~
      |                            |
      |                            void*
hello-world.c: In function ‘void signal_cb(int, short int, void*)’:
hello-world.c:135:28: error: invalid conversion from ‘void*’ to ‘event_base*’ [-fpermissive]
  135 |  struct event_base *base = user_data;
      |                            ^~~~~~~~~
      |                            |
      |                            void*
(base) liufeng@liufeng-Lenovo:~/LVYsince2021/LVYGrail/implStudio$ gcc -o outhello hello-world.c -I /usr/local/include/event2/ -levent -levent_core -levent_extra -levent_pthreads
(base) liufeng@liufeng-Lenovo:~/LVYsince2021/LVYGrail/implStudio$ g++ -o outhello hello-world.c -I /usr/local/include/event2/ -levent -levent_core -levent_extra -levent_pthreads
hello-world.c: In function ‘void listener_cb(evconnlistener*, int, sockaddr*, int, void*)’:
hello-world.c:92:28: error: invalid conversion from ‘void*’ to ‘event_base*’ [-fpermissive]
   92 |  struct event_base *base = user_data;
      |                            ^~~~~~~~~
      |                            |
      |                            void*
hello-world.c: In function ‘void signal_cb(int, short int, void*)’:
hello-world.c:135:28: error: invalid conversion from ‘void*’ to ‘event_base*’ [-fpermissive]
  135 |  struct event_base *base = user_data;
      |                            ^~~~~~~~~
      |                            |
      |                            void*
*******************************************************************************************

gcc -o outhello hello-world.c -I /usr/local/include/event2/ -levent -levent_core -levent_extra -levent_pthreads
(base) liufeng@liufeng-Lenovo:~/LVYsince2021/LVYGrail/implStudio$ g++ -o outhello hello-world.c -I /usr/local/include/event2/ -levent -levent_core -levent_extra -levent_pthreads
hello-world.c: In function ‘void listener_cb(evconnlistener*, int, sockaddr*, int, void*)’:
hello-world.c:92:28: error: invalid conversion from ‘void*’ to ‘event_base*’ [-fpermissive]
   92 |  struct event_base *base = user_data;
      |                            ^~~~~~~~~
      |                            |
      |                            void*
hello-world.c: In function ‘void signal_cb(int, short int, void*)’:
hello-world.c:135:28: error: invalid conversion from ‘void*’ to ‘event_base*’ [-fpermissive]
  135 |  struct event_base *base = user_data;
      |                            ^~~~~~~~~
      |                            |
      |                            void*
 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐