C++ C++;如何将boost库与我的共享库链接,以便在目标机器上工作?

C++ C++;如何将boost库与我的共享库链接,以便在目标机器上工作?,c++,boost,cmake,C++,Boost,Cmake,我试图使jni共享库 我在这个库的代码中使用了boost库 我成功地在开发机器上创建了共享库,并完成了测试 我在目标机器上创建包含libboost*.so文件的boost lib文件夹,并将其添加到LD_LIBRARY_路径 因此,我尝试在目标机器上进行测试(与开发机器的操作系统平台相同),但目标机器无法链接它 因此,我的java程序找到my.So(libsample.So),但libsample.So找不到boost库并抛出消息(未定义符号:_ZTIN5boost6detail16thread

我试图使jni共享库

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

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

我在目标机器上创建包含libboost*.so文件的boost lib文件夹,并将其添加到LD_LIBRARY_路径

因此,我尝试在目标机器上进行测试(与开发机器的操作系统平台相同),但目标机器无法链接它

因此,我的java程序找到my.So(libsample.So),但libsample.So找不到boost库并抛出消息(未定义符号:_ZTIN5boost6detail16thread_data_baseE)

我怎样才能解决这个问题

  • 我想在我的共享库中打包boost库
  • 或者我想用我的共享库动态链接boost库
  • 我的项目的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})
    
    谢谢,马丁·邦纳

    我解决了这个问题

    这是我编辑的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})
    

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


    我成功地制作了。所以库中包括boost库作为静态库

    您需要将Boost创建为一个静态库,并通过链接创建JNI共享对象。恐怕我对CMake或Boost的了解还不够,无法给出一个正确的答案,但这可能是一个足够的线索,可以帮助您解决这个问题。(如果你真的解决了这个问题,请回答你自己的问题——这是完全合法的,并且允许其他人在将来找到解决方案。)谢谢,我按照你的方法解决它。我回答了我的问题,包括cmake source。我实际上看不到更改。对不起,我无法阅读这篇文章这么长时间。变化点为2。(1) 取消设置与Boost相关的缓存。(2) 位置独立代码(fPIC)。对于这个选项,我必须使用-fPIC重新编译boost库。