2012-02-13 14 views
5

Szukałem i okazało się, że wiele osób ma ten sam problem, ale nie istnieje rozwiązanie.CMake and Boost

Używam CMake do generowania Makefile dla MinGW i podczas kompilacji dostaję błąd:

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' 

To wydaje się być problemem łączącą, rozumiem. Moja konfiguracja CUpewnij jest:

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) 

Najpierw spróbował wykorzystać find_package(Boost COMPONENTS thread) i to działa w ten sam sposób, więc pomyślałem, aby spróbować zrobić to ręcznie, a ja wciąż dostać ten sam błąd.

Wszelkie informacje na ten temat?

Zrobiłem to dla mingw używając bjam i jako link statyczny. Próbowałem także:

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) 

I nadal otrzymuję te same komunikaty o błędach.

Odpowiedz

10

Dla mingw32 można dodać definicję BOOST_THREAD_USE_LIB. Połączenie z wątkiem boost :: będzie działało. Również możesz potrzebować pakietu Threads (ale nie jestem pewien, może to być konieczne tylko dla platform * nix).

Oto część moich CMakeLists. Skopiowałem go od projektu, który używa boost :: wątek i kompiluje pod mingw-gcc (i innych kompilatorów):

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

Dodanie dla mnie BOOST_THREAD_USE_LIB. Przez ostatnią godzinę drapałem się po tej głowie. – CadentOrange

3

Moim zdaniem, to pytanie jest podobne do this question i this one. Domyślam się, że potrzebujesz takiej samej rozdzielczości jak w mojej odpowiedzi na first question.

Zdecydowanie zaleca się stosowanie find_package (Boost) i dbać o autolinkowania:

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

Próbowałem wszystkiego z tych stanowisk już, ale także ponownie sprawdzić wszystko i teraz cały czas Otrzymuję ten sam błąd. Znajduje bibliotekę i ustawia ją doskonale, ale w jakiś sposób po prostu się nie połączy ... Zrekompilowałem też boost używając '--build-type = complete' i próbowałem zrobić dynamiczne łączenie, i wciąż wygrałem 't work ... –

+0

W moim przypadku musiałem dodać 'find_package (ZMNIEJSZENIE systemu wątków COMONENTS REQUIRED)' i 'target_link_libraries ( $ {Boost_LIBRARIES})' oczywiście! – Tanasis