16

GCC 4.4.5、CMake 2.8.2、および Boost 1.53.0 を使用して Linux で実行されている単純な boost.log の例を取得しようとしています。

ブーストとブースト ログのコンパイルは成功しましたが、テスト プログラムを boost.log にリンクするときに問題が発生し続けます。

次の CMakeLists.txt ファイルを使用します。

cmake_minimum_required(VERSION 2.8)

project(QuantibBoostLogTest)

# Include boost headers
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Threads)
find_package(Boost 1.53.0 COMPONENTS thread date_time filesystem system log log_setup REQUIRED)
if(Boost_FOUND)
  include_directories( ${Boost_INCLUDE_DIRS} )
  link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES})
else(Boost_FOUND)
  message(FATAL_ERROR "Cannot build Quantib Boost Log test without Boost. Please set Boost_DIR.")
endif(Boost_FOUND)

add_executable(quantibBoostLogTest boost_log_test.cxx)
install(TARGETS quantibBoostLogTest DESTINATION .)

CMake はブースト ライブラリを正しく検出しますが、主に次の形式のリンカー エラーが発生します。

core.cpp:(.text+0x1b0e): undefined reference to `boost::detail::get_tss_data(void const*)'

スレッド ライブラリをリンクします。これを解決する方法を知っている人はいますか?

4

2 に答える 2

22

boost.log は boost.thread ライブラリに依存しているようで、ライブラリの順序を変更する必要があります。リンクの順序が重要な理由を見る

次の順序で試してください

find_package(Boost 1.53.0 COMPONENTS log log_setup thread date_time filesystem system REQUIRED)

それが役に立たない場合は、次のように2回含めてみてください

link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} ${Boost_LIBRARIES})
于 2013-05-16T21:47:33.713 に答える
2

あなたが与えるリンカーエラーは、pthreadsやboost_threadなどのネイティブスレッドライブラリに対してリンクしていないことに関係しています。(または両方)

1)私が見るところ、あなたは pthreads ライブラリにリンクしていません。
ライブラリを見つけようとする CMake カスタム モジュールを呼び出すだけでは、ライブラリに対してもリンクされるわけではありません。

試してみてください:

SET(CMAKE_THREAD_PREFER_PTHREAD true)
FIND_PACKAGE (スレッド)
IF(Threads_FOUND)
INCLUDE_DIRECTORIES(SYSTEM ${Threads_INCLUDE_DIR})
MESSAGE("pthreads を使用していますか? ${CMAKE_USE_PTHREADS_INIT}")
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})
END

スレッド モジュールの使用に関する詳細については、CMake インストールの FindThreads.cmake ファイルを確認してください。通常は /usr/share/cmake-2.8/Modules/ にあります。

2) リンクされた Boost ライブラリの順序が間違っているか、Boost に指定したバージョンが無効である可能性があります。

ブースト バージョンを変更してみるか、まったく指定しないか、リンクされたライブラリの順序を変更してください

SET(Boost_USE_STATIC_LIBS ON)  
SET(Boost_USE_MULTITHREADED ON)  
FIND_PACKAGE(Boost 1.53.0 COMPONENTS **system thread filesystem date_time log log_setup** REQUIRED)  

IF(Boost_FOUND)  
    INCLUDE_DIRECTORIES(SYSTEM ${Boost_INCLUDE_DIR})  
    LINK_DIRECTORIES(${Boost_LIBRARY_DIR})  
    MESSAGE("Boost information")  
    MESSAGE("Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")  
    MESSAGE("Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}")  
    MESSAGE("Boost Libraries: ${Boost_LIBRARIES}")  
    TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES})  
ENDIF()

(FIND_PACKAGE の COMPONENTS の後に指定された要素の順序は問題ではないと思うので、2 番目の競合は完全に間違っている可能性があります)

于 2013-05-14T11:26:50.900 に答える