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 を使用します。クラス内のメンバーの 1 つは次のとおりです。
boost::thread_specific_ptr<TLSData> threadData;
それは私がブーストから使用しているものだけです