2016-12-30 3 views
0

Я пытаюсь включить библиотеку потоков Boost в свой проект на C++. Мой файл CMake, как так:Linking Boost thread library

cmake_minimum_required(VERSION 3.6) 
project(LearningC) 

find_package(Boost REQUIRED) 
include_directories(${Boost_INCLUDE_DIR}) 

set(CMAKE_CXX_STANDARD 11) 

set(SOURCE_FILES main.cpp Student.cpp Student.h) 

add_executable(LearningC ${SOURCE_FILES}) 

target_link_libraries(LearningC ${Boost_LIBRARIES}) 

Я получаю сообщение об ошибке:

Undefined symbols for architecture x86_64: 
    "boost::this_thread::interruption_point()", referenced from: 
     boost::condition_variable::wait(boost::unique_lock<boost::mutex>&) in main.cpp.o 
    [More stack traces...] 

Что я делаю неправильно?

+1

Итак, вам нужно перечислить библиотеку потоков в 'find_package (Boost)' call: 'find_package (Boost COMPONENTS thread REQUIRED)'. Как [там] (http://stackoverflow.com/a/3917033/3440745). – Tsyvarev

+0

В моем случае мне пришлось добавить 'find_package (Boost COMPONENTS thread system REQUIRED)' и 'target_link_libraries ( $ {Boost_LIBRARIES})' конечно! – Tanasis

ответ

0

Я нашел решение. В основном, Boost имеет большую часть своего кода в заголовках C++ (.hpp). Некоторые из библиотек, однако, необходимо скомпилировать и связать ... Код ниже работает!

cmake_minimum_required(VERSION 3.6) 
project(LearningC) 

set(CMAKE_CXX_STANDARD 11) 

set(SOURCE_FILES main.cpp Student.cpp Student.h) 

add_executable(LearningC ${SOURCE_FILES}) 

find_package(Boost COMPONENTS thread system REQUIRED) 

include_directories(${Boost_INCLUDE_DIR}) 
target_link_libraries(LearningC ${Boost_LIBRARIES}) 
1

Хорошо, я вижу, ты нашел решение, но есть некоторые улучшения, я хотел бы предложить (как только вы требуете CMake 3.6):

  • использование импортирована цели управления опции компилятора/линкера на цели, вместо «глобальных» переменных и функций (как include_directories() ...)
  • использование полной подписи project() определить кучу PROJECT_xxx переменных, а затем использовать их
  • предоставить поименный список Ла nguages ​​вы используете, чтобы избежать ошибок по умолчанию и возможных избыточных проверок.
  • в случае Boost вам не нужно искать и ссылаться на неявные зависимости. FindBoost.cmake сделает это за вас. Просто укажите компоненты только то, что вам действительно нужно и нужно использовать.

Вот модифицированный CMakeLists.txt:

cmake_minimum_required(VERSION 3.6) 
project(LearningCxx VERSION 1.0.0 LANGUAGES CXX) 

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 

find_package(Boost COMPONENTS thread REQUIRED) 

add_executable(
    ${PROJECT_NAME} 
    main.cpp 
    Student.cpp 
) 

target_link_libraries(
    ${PROJECT_NAME} 
    Boost::thread 
) 

Обновление: Я сделал пример для этого проекта, но удалить Students.cpp и заменить main.cpp со следующим кодом:

#include <boost/thread.hpp> 
#include <iostream> 

int main() 
{ 
    std::cout << boost::thread::hardware_concurrency() << std::endl; 
} 

Вот мой тестовый прогон:

[email protected]〉…/tests/boost-thread-cmake/build〉empty dir〉cmake .. 
-- The CXX compiler identification is GNU 5.4.0 
-- Check for working CXX compiler: /usr/lib/outproc/bin/c++ -- works 
-- Detecting CXX compiler ABI info - done 
-- Detecting CXX compile features - done 
-- Looking for C++ include pthread.h - found 
-- Looking for pthread_create - not found 
-- Looking for pthread_create in pthreads - not found 
-- Looking for pthread_create in pthread - found 
-- Found Threads: TRUE 
-- Boost version: 1.62.0 
-- Found the following Boost libraries: 
-- thread 
-- chrono 
-- system 
-- date_time 
-- atomic 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /work/tests/boost-thread-cmake/build 
[email protected]〉…/tests/boost-thread-cmake/build〉default〉pfx: /usr/local〉make 
Scanning dependencies of target LearningCxx 
[ 50%] Building CXX object CMakeFiles/LearningCxx.dir/main.cpp.o 
[100%] Linking CXX executable LearningCxx 
[100%] Built target LearningCxx 
[email protected]〉…/tests/boost-thread-cmake/build〉default〉pfx: /usr/local〉ldd ./LearningCxx 
     linux-vdso.so.1 (0x00007fff73b75000) 
     libboost_thread.so.1.62.0 => /usr/lib64/libboost_thread.so.1.62.0 (0x00007fd1adafd000) 
     libboost_chrono.so.1.62.0 => /usr/lib64/libboost_chrono.so.1.62.0 (0x00007fd1ad8f6000) 
     libboost_system.so.1.62.0 => /usr/lib64/libboost_system.so.1.62.0 (0x00007fd1ad6f2000) 
     libboost_date_time.so.1.62.0 => /usr/lib64/libboost_date_time.so.1.62.0 (0x00007fd1ad4e1000) 
     libboost_atomic.so.1.62.0 => /usr/lib64/libboost_atomic.so.1.62.0 (0x00007fd1ad2df000) 
     libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd1ad0c3000) 
     libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/libstdc++.so.6 (0x00007fd1accc8000) 
     libm.so.6 => /lib64/libm.so.6 (0x00007fd1ac9cd000) 
     libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/libgcc_s.so.1 (0x00007fd1ac7b6000) 
     libc.so.6 => /lib64/libc.so.6 (0x00007fd1ac41d000) 
     librt.so.1 => /lib64/librt.so.1 (0x00007fd1ac215000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fd1add25000) 
[email protected]〉…/tests/boost-thread-cmake/build〉default〉pfx: /usr/local〉cmake --version 
cmake version 3.7.1 
+0

Под «неявными зависимостями» ... вы имеете в виду системную библиотеку? Если это так, я удалил его и компилятор жаловался: Неопределенные символы для архитектуры x86_64: «boost :: system :: system_category()» –

+0

@MikeM, насколько я помню «FindBoost.cmake» способен находить и link w/implicit deps в CMake 3.6 также ... проверьте функцию '_Boost_MISSING_DEPENDENCIES' в этом модуле ... – zaufi