CMake и Boost - PullRequest
       72

CMake и Boost

5 голосов
/ 13 февраля 2012

Я искал и обнаружил, что у многих людей такая же проблема, но решения не существует.

Я использую CMake для генерации Makefiles для MinGW и при компиляции я получаю сообщение об ошибке:

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), и он работал точно так же, поэтому я попытался сделать это вручную, и все равно получаю ту же ошибку.

Есть идеи по этому поводу?

Я скомпилировал его для mingw, используя bjam и в качестве статической ссылки. Также попытался сделать:

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)

И я все еще получаю те же сообщения об ошибках.

Ответы [ 2 ]

10 голосов
/ 14 февраля 2012

Для mingw32 вы можете добавить определение BOOST_THREAD_USE_LIB.И связь с boost :: thread будет работать.Также вам может понадобиться пакет Threads (но я не уверен, возможно, он нужен только для * nix-платформ).

Вот часть моего CMakeLists.Я скопировал его из проекта, который использует boost :: thread и компилирует в 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}
    )
3 голосов
/ 13 февраля 2012

На мой взгляд, этот вопрос похож на этот вопрос и этот . Моим лучшим предположением будет то, что вам нужно то же разрешение, что и в моем ответе на первый вопрос .

Я бы настоятельно рекомендовал использовать find_package (Boost) и позаботиться об автоматической привязке:

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} )
...