1

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;

それは私がブーストから使用しているものだけです

4

1 に答える 1