C ++如何将boost库与我的共享库链接起来在目标机器上工作?

时间:2017-10-02 08:34:01

标签: c++ boost cmake

我尝试制作jni共享库。

我在这个库的代码中使用了boost库。

我成功地在开发机器上创建了共享库并完成了测试。

我创建了lib lib文件夹,其中包含libboost _ *。所以文件在目标机器上,并将其添加到LD_LIBRARY_PATH。

所以,我尝试在目标机器上测试(与开发机器相同的OS平台),但目标机器无法链接它。

所以,我的java程序找到我的.so(libsample.so)但是libsample.so找不到boost库并抛出消息(未定义的符号:_ZTIN5boost6detail16thread_data_baseE)

我该如何解决这个问题?

  1. 我想在我的共享库中打包提升库
  2. 或者我想使用我的共享库自动与boost库进行链接。
  3. 我的项目的CMakeLists.txt

    cmake_minimum_required(VERSION 3.0)
    ### This CMakeLists.txt  : Root CMake of this project
    ################## complie settings of this project ##################
    set(ARTIFACT_NAME "sample-plugin")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread ")
    add_definitions("-Wno-deprecated-declarations")
    add_definitions("-Wno-write-strings")
    ################## Boost Settings ##################
    set(Boost_NO_SYSTEM_PATH ON)
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_MULTITHREADED ON)
    set(Boost_USE_STATIC_RUNTIME ON)
    set(BOOST_INCLUDE_DIR "${BOOST_ROOT}/boost")
    include_directories(${BOOST_INCLUDE_DIR})
    link_directories(${BOOST_INCLUDE_DIR})
    link_directories(${BOOST_LIBRARY_DIR})
    find_package(Boost 1.58.0 REQUIRED)
    include_directories("$ENV{JAVA_HOME}/include")
    if (WIN32)
    include_directories("$ENV{JAVA_HOME}/include/win32")
    else ()
    include_directories("$ENV{JAVA_HOME}/include/linux")
    endif ()
    add_library(${ARTIFACT_NAME} SHARED ${SOURCES} )
    target_link_libraries(${ARTIFACT_NAME} ${Boost_LIBRARIES})
    

1 个答案:

答案 0 :(得分:0)

谢谢,Martin Bonner。

我解决了这个问题。

这是我编辑的CMakeLists.txt

################## complie settings of this project ##################
set(ARTIFACT_NAME "sample-plugin")
#set(CMAKE_CXX_STANDARD 11) # 아래에 -std=c++11 옵션과 중복
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -shared -fPIC -std=c++11 -pthread ")
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
add_definitions("-Wno-deprecated-declarations")
add_definitions("-Wno-write-strings")
################## Boost Settings ##################
set(Boost_NO_SYSTEM_PATH ON)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME ON)
set(BOOST_INCLUDE_DIR "${BOOST_ROOT}/boost")
include_directories(${BOOST_INCLUDE_DIR})
link_directories(${BOOST_INCLUDE_DIR})
link_directories(${BOOST_LIBRARY_DIR})
unset(Boost_INCLUDE_DIR CACHE)
unset(Boost_LIBRARY_DIRS CACHE)
find_package(Boost 1.58.0 REQUIRED COMPONENTS thread date_time filesystem system program_options )
################## Target Settings ##################
add_library(${ARTIFACT_NAME} SHARED ${SOURCES})
set_target_properties(${ARTIFACT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_link_libraries(${ARTIFACT_NAME} ${Boost_LIBRARIES})

################## complie settings of this project ################## set(ARTIFACT_NAME "sample-plugin") #set(CMAKE_CXX_STANDARD 11) # 아래에 -std=c++11 옵션과 중복 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -shared -fPIC -std=c++11 -pthread ") set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_definitions("-Wno-deprecated-declarations") add_definitions("-Wno-write-strings") ################## Boost Settings ################## set(Boost_NO_SYSTEM_PATH ON) set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME ON) set(BOOST_INCLUDE_DIR "${BOOST_ROOT}/boost") include_directories(${BOOST_INCLUDE_DIR}) link_directories(${BOOST_INCLUDE_DIR}) link_directories(${BOOST_LIBRARY_DIR}) unset(Boost_INCLUDE_DIR CACHE) unset(Boost_LIBRARY_DIRS CACHE) find_package(Boost 1.58.0 REQUIRED COMPONENTS thread date_time filesystem system program_options ) ################## Target Settings ################## add_library(${ARTIFACT_NAME} SHARED ${SOURCES}) set_target_properties(${ARTIFACT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) target_link_libraries(${ARTIFACT_NAME} ${Boost_LIBRARIES})

在此cmake运行之前,我使用-cxxflags = -fPIC重新编译boost库,因为this issue

我成功地将.so库包括boost库作为静态库。