gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:49:10 25 4
gpt4 key购买 nike

我尝试制作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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com