2012-02-13 9 views
5

私は、多くの人が同じ問題を抱えていることを突き止めて見つけましたが、解決策はありません。私はMinGWのためのMakefileを生成するために、CMakeのを使っていますし、コンパイルするとき、私はエラーを取得していますCMakeとBoost

CMakeFiles\boosttest.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x5e): undefined reference to `_imp___ZN5boost6thread4joinEv' 
CMakeFiles\boosttest.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x71): undefined reference to `_imp___ZN5boost6threadD1Ev' 
CMakeFiles\boosttest.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x88): undefined reference to `_imp___ZN5boost6threadD1Ev' 

これは連結の問題のようです、私はそれを取得します。私のcmakeの構成は次のとおりです。

project(boosttest) 
cmake_minimum_required(VERSION 2.6) 

include_directories(${boosttest_SOURCE_DIR}/include c:/boost_1_48_0/) 
link_directories(c:/boost_1_48_0/lib) 

file(GLOB_RECURSE cppFiles src/*.cpp) 

add_executable(boosttest ${cppFiles}) 

target_link_libraries(boosttest libboost_thread-mgw46-mt-1_48.a) 

まず私はfind_package(Boost COMPONENTS thread)を使用してみました、それは同じように働いていたので、私はこれを手動で行うと、私はまだ同じエラーを取得しようとすると思いました。

これについての洞察はありますか?

私はbjamを静的リンクとして使用してmingw用にコンパイルしました。また、やってみました:

add_library(imp_libboost_thread STATIC IMPORTED) 
set_property(TARGET imp_libboost_thread PROPERTY IMPORTED_LOCATION c:/boost_1_48_0/lib/libboost_thread-mgw46-mt-1_48.a) 
target_link_libraries(boosttest imp_libboost_thread) 

また、同じエラーメッセージが表示されます。

答えて

10

あなたが定義BOOST_THREAD_USE_LIBを追加することができます。 boost :: threadとリンクすると動作します。また、Threadsパッケージが必要な場合もあります(しかし、確かではありません。* nixプラットフォームのみ必要です)。

ここに私のCMakeListsの一部です。私が後押し::スレッドを使用するプロジェクト、からそれをコピーして、mingwの - gccの(および他のコンパイラ)の下でコンパイルされます。私はすでに、これらの記事からすべてを試してみた

set(Boost_USE_STATIC_LIBS ON) 
    set(Boost_USE_MULTITHREADED ON) 
    set(Boost_ADDITIONAL_VERSIONS "1.44" "1.44.0") 
    find_package(Boost COMPONENTS thread date_time program_options filesystem system REQUIRED) 
    include_directories(${Boost_INCLUDE_DIRS}) 

    find_package(Threads REQUIRED) 

    #... 

    if (WIN32 AND __COMPILER_GNU) 
     # mingw-gcc fails to link boost::thread 
     add_definitions(-DBOOST_THREAD_USE_LIB) 
    endif (WIN32 AND __COMPILER_GNU) 

    #... 

    target_link_libraries(my_exe 
      ${CMAKE_THREAD_LIBS_INIT} 
      #... 
     ${Boost_LIBRARIES} 
    ) 
+0

BOOST_THREAD_USE_LIBを追加すると、私のために修正されました。私はこの1時間ほど頭を掻き回してきました。 – CadentOrange

3

私の意見では、この質問はthis questionthis oneに似ています。私の最高の推測は、あなたがfirst questionへの私の答えと同じ解像度を必要とすることでしょう。

私は強くfind_package(ブースト)を使用することをお勧めしますと自動リンクで世話をするでしょう:MINGW32については

project(boosttest) 
cmake_minimum_required(VERSION 2.6) 

# Play with the following defines 
# Disable auto-linking. 
add_definition(-DBOOST_ALL_NO_LIB) 
# In case of a Shared Boost install (dlls), you should then enable this 
# add_definitions(-DBOOST_ALL_DYN_LINK) 

# Explicitly tell find-package to search for Static Boost libs (if needed) 
set(Boost_USE_STATIC_LIBS ON) 
find_package(Boost REQUIRED COMPONENTS thread) 

include_directories(${Boost_INCLUDE_DIRS}) 

file(GLOB_RECURSE cppFiles src/*.cpp) 

add_executable(boosttest ${cppFiles}) 

target_link_libraries(boosttest ${Boost_LIBRARIES}) 
+0

、だけでなく、今ではすべてを再チェックし、すべての時間私は同じエラーを取得します。ライブラリを見つけてインクルードを完全にセットするが、どういうわけかそれはリンクしないだろう...私は '--build-type = complete'を使ってboostを再コンパイルしてダイナミックリンクを試みたが、それでも勝った... –

+0

私の場合は、find_package(コンポーネントシステムのブーストを必要とする)と 'target_link_libraries( $ {Boost_LIBRARIES})を追加する必要がありました! – Tanasis