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

标签 c++ boost cmake

我尝试制作jni共享库。

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

我在开发机上成功制作了共享库并测试完成。

我在目标计算机上创建了包含 libboost_*.so 文件的 boost lib 文件夹,并将其添加到 LD_LIBRARY_PATH 中。

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

所以,我的java程序找到了我的.so(libsample.so),但libsample.so找不到boost库并抛出消息( undefined symbol :_ZTIN5boost6detail16thread_data_baseE)

如何解决这个问题?

  1. 我想将 boost 库打包到我的共享库中
  2. 或者我想将 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

################## 编译此项目的设置 ##################
设置(ARTIFACT_NAME“样本插件”)
#set(CMAKE_CXX_STANDARD 11) # 设置 -std=c++11
设置(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS} -共享-fPIC -std = c++ 11 -pthread”)
设置(CMAKE_POSITION_INDEPENDENT_CODE ON)
add_definitions("-Wno-deprecated-declarations")
add_definitions("-Wno-write-strings")
##################  boost 设置 ##################
设置(Boost_NO_SYSTEM_PATH ON)
设置(Boost_USE_STATIC_LIBS ON)
设置(Boost_USE_MULTITHREADED ON)
设置(Boost_USE_STATIC_RUNTIME ON)
设置(BOOST_INCLUDE_DIR "${BOOST_ROOT}/boost")
include_directories(${BOOST_INCLUDE_DIR})
链接目录(${BOOST_INCLUDE_DIR})
link_directories(${BOOST_LIBRARY_DIR})
取消设置(Boost_INCLUDE_DIR CACHE)
取消设置(Boost_LIBRARY_DIRS CACHE)
find_package(Boost 1.58.0 所需组件 线程 date_time 文件系统 系统 program_options )
################## 目标设置 ##################
add_library(${ARTIFACT_NAME} 共享 ${SOURCES})
set_target_properties(${ARTIFACT_NAME} 属性 POSITION_INDEPENDENT_CODE ON)
target_link_libraries(${ARTIFACT_NAME} ${Boost_LIBRARIES})

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

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

关于C++ 如何将 boost 库与我的共享库链接以在目标机器上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46522068/

相关文章:

c++ - SDL2 + OpenGL = Gnome 3 错误地提示 "Program not responding"

c++ - 在这种情况下如何从 vector 中删除一个项目?

c++ - 如何使用 Visual Studio 2015(企业版)构建 boost 版本 1.58.0

c++ - CMake:如何仅将特定文件扩展名从一个目录复制到另一个目录

c++ - 为什么在只有一个应有的链表上进行合并时,总是将两个表都设置为NULL?

c++ - 客户端连接到服务器,但服务器认为客户端没有连接到 C++

c++ - Visual Studio 2012 Boost.Python 集成

c++ - 在g++ <7.4.0>上boost::archive::text_iarchive in_archive {is} boost <1.71>崩溃

cmake - 在任何平台上从命令行选择CMake的 Release模式

CMake 支持 "make uninstall"吗?