2012-02-13 22 views
5

Ho cercato e scoperto che molte persone hanno lo stesso problema, ma non esiste alcuna soluzione.CMake and Boost

sto usando CMake per generare Makefile per MinGW e durante la compilazione sto ottenendo un errore:

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' 

questo sembra essere un problema di collegamento, ho capito. La mia configurazione è 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) 

Per prima cosa ho provato ad utilizzare find_package(Boost COMPONENTS thread) e che stava lavorando allo stesso modo, così ho pensato di provare a farlo manualmente e ho ancora ottenere lo stesso errore.

Eventuali approfondimenti su questo?

L'ho compilato per mingw usando bjam e come collegamento statico. Anche provato a fare:

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) 

E ho ancora gli stessi messaggi di errore.

risposta

10

Per mingw32 si può aggiungere definizione BOOST_THREAD_USE_LIB. E il collegamento con boost :: thread funzionerà. Potrebbe anche essere necessario il pacchetto Threads (ma non sono sicuro, potrebbe essere necessario solo per piattaforme * nix).

Ecco parte delle mie CMakeLists. Ho copiato dal progetto, che utilizza boost :: thread e compila sotto mingw-gcc (e altri compilatori):

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

L'aggiunta di BOOST_THREAD_USE_LIB l'ha corretta per me. Mi sono grattato la testa per quest'ultima ora. – CadentOrange

3

A mio parere, questa domanda è simile a this question e this one. La mia ipotesi migliore sarebbe che hai bisogno della stessa risoluzione della mia risposta allo first question.

che vi consiglio vivamente l'uso di find_package (Boost) e prendersi cura con l'auto-linking:

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

Ho provato tutto da quei posti già, ma anche ricontrollato tutto ora e per tutto il tempo Ho fatto lo stesso errore. Trova la libreria e imposta gli include perfettamente, ma in qualche modo semplicemente non collegherà ... Ho anche ricompilato il boost usando '--build-type = complete' e ho provato a fare un collegamento dinamico, e ha comunque vinto 't work ... –

+0

Nel mio caso ho dovuto aggiungere 'find_package (Boost COMPONENTS thread system RICHIESTO)' e 'target_link_libraries ( $ {Boost_LIBRARIES})' ovviamente! – Tanasis