2012-02-13 10 views
5

Tôi đã tìm kiếm và phát hiện ra rằng rất nhiều người có cùng một vấn đề, nhưng không có giải pháp nào tồn tại.CMake và Boost

Tôi đang sử dụng CMake để tạo Makefiles cho MinGW và khi biên soạn tôi nhận được một lỗi:

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' 

Điều này dường như là một vấn đề liên kết, tôi nhận được nó. cấu hình CMake của tôi là:

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) 

Trước tiên tôi cố gắng sử dụng find_package(Boost COMPONENTS thread) và nó đã làm việc cùng một cách, vì vậy tôi nghĩ để cố gắng làm điều này bằng tay và tôi vẫn nhận được lỗi tương tự.

Mọi thông tin chi tiết về vấn đề này?

Tôi đã biên soạn nó để trộn lẫn bằng bjam và dưới dạng liên kết tĩnh. Cũng đã thử thực hiện:

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) 

Và tôi vẫn nhận được thông báo lỗi tương tự.

Trả lời

10

Đối mingw32 bạn có thể thêm nét BOOST_THREAD_USE_LIB. Và liên kết với boost :: thread sẽ hoạt động. Ngoài ra, bạn có thể cần gói Threads (nhưng tôi không chắc chắn, có thể nó chỉ cần cho các nền tảng * nix).

Đây là một phần của CMakeLists của tôi. Tôi đã sao chép nó từ dự án, sử dụng boost :: thread và biên dịch theo mingw-gcc (và các trình biên dịch khác):

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

Thêm BOOST_THREAD_USE_LIB đã sửa nó cho tôi. Tôi đã gãi đầu của tôi về điều này trong vài giờ qua. – CadentOrange

3

Theo ý kiến ​​của tôi, câu hỏi này tương tự như this questionthis one. Dự đoán tốt nhất của tôi là bạn cần cùng độ phân giải như trong câu trả lời của tôi cho số first question.

Tôi muốn giới thiệu mạnh mẽ việc sử dụng find_package (Boost) và chăm sóc với các tính năng tự động liên kết:

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

Tôi đã thử mọi thứ từ các bài đăng đó, nhưng cũng kiểm tra lại mọi thứ ngay bây giờ và mọi lúc Tôi nhận được lỗi tương tự. Nó tìm thấy thư viện và thiết lập bao gồm một cách hoàn hảo, nhưng bằng cách nào đó nó sẽ không liên kết ... Tôi cũng đã biên dịch lại bằng cách sử dụng '--build-type = complete' và cố gắng tạo một liên kết động, và nó vẫn thắng 't work ... –

+0

Trong trường hợp của tôi, tôi phải thêm 'find_package (hệ thống chủ đề Boost COMPONENTS REQUIRED)' và 'target_link_libraries ( $ {Boost_LIBRARIES})' tất nhiên! – Tanasis