【发布时间】:2017-10-26 13:39:06
【问题描述】:
我正在使用 CMake 编译一个简单的项目(共享库),这是 CMakeLists.txt 的内容
set (CMAKE_BUILD_TYPE Release)
set (LibName test)
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(test CXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${warnings}")
add_definitions(${GCC_NARROWING})
add_definitions(${GCC_RESOLVEALL})
add_definitions(-DTESTFRAMEWORK_GOOGLE)
add_definitions(-DVARIADIC_MAX=10)
add_definitions(-DENCODING=8)
#include_directories(${GTEST_PATH}/include)
include_directories(${BOOST_PATH}) #${BOOST_PATH} is defined by parent CMakeList
include_directories(${GTEST_PATH}/include ../../ThirdParty/rapidjson_master/include)
set (SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/Test.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Test.h
)
message(${LibName})
add_library(${LibName} SHARED ${SOURCES})
target_link_libraries(${LibName}
${OUTDIR}/libboost_system.a
${OUTDIR}/libboost_thread.a
${OUTDIR}/libboost_chrono.a
)
编译时我没有收到任何错误,当运行加载此共享库的程序时我收到:
./test.so: 未定义符号:_ZN5boost6system15system_categoryEv
加载此共享库的程序只需执行以下操作:
void *m_hTest = dlopen("./test.so", RTLD_NOW);
if (m_hTest == NULL) {
return -1;
}
共享库使用 Boost 的 Thread Local Storage,在一个类中,其中一个成员是:
boost::thread_specific_ptr<TLSData> threadData;
这是我在 boost 中唯一使用的东西
【问题讨论】:
-
您使用的是什么平台/环境?通常,我使用
find_package(Boost COMPONENTS system)来查找提升。如果您使用包管理器安装了 boost,这通常可以正常工作。然后我使用target_link_libraries(${LibName} boost::system)链接并导入适当的包含目录。有一些很棒的文档here -
P.S.您描述的错误不是“运行时错误”。这是一个链接器错误。运行应用程序时会发生运行时错误。
标签: c++ boost cmake shared-libraries boost-system