cmake і libpthread


188

Я бігаю RHEL 5.1і використовую gcc.

Як я можу cmakeдодати -pthreadдо компіляції та зв’язування?


1
Чи можете ви вибрати для цього відповідь?
Джаред Берроуз

1
Чувак, ти повинен вибрати як Мануеля відповідь.

@Ehsan thehouse відповідь набагато краще! :-)
Ela782

Відповіді:


208

@Manuel був частково там. Ви також можете додати варіант компілятора, як це:

Якщо у вас CMake 3.1.0+, це стає ще простіше :

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)

Якщо ви використовуєте CMake 2.8.12+, ви можете спростити це до:

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  target_compile_options(my_app PUBLIC "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

Старіші версії CMake можуть вимагати:

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  set_property(TARGET my_app PROPERTY COMPILE_OPTIONS "-pthread")
  set_property(TARGET my_app PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

Якщо ви хочете використовувати один із перших двох методів з CMake 3.1+, вам знадобиться і set(THREADS_PREFER_PTHREAD_FLAG ON)там.


Схоже, що, наприклад, CMake 3.0.2 не встановить THREADS_HAVE_PTHREAD_ARG, якщо бібліотека pthread знайдена ( NOT CMAKE_HAVE_THREADS_LIBRARY), наприклад, на Ubuntu 15.04 :(
mlt

1
Версія, надана для CMake 2.8.12+, не працюватиме за призначенням через те, як працює код /usr/share/cmake-2.8/Modules/FindThreads.cmake(наприклад, див. Тут apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) в основному, THREADS_HAVE_PTHREAD_ARGвстановлено , тільки якщо інші варіанти прапора не були знайдені (тобто. -lpthread, -lpthreadабо -lthread)
j1elo

Це дає помилку "Неможливо вказати бібліотеки посилань для цільової" my_app ", яка не побудована цим проектом." - як ви це дозволяєте універсально, не роблячи це окремо для кожної цілі?
Кріс Додд

Це перший все-таки найпростіший спосіб у 2020 році / cmake 3.17?
Джей

Що станеться, якщо ви не встановите прапор THREADS_PREFER_PTHREAD_FLAG, просто знайдіть і зв’яжіть?
Джей

199

Наступні повинні бути чистими (за допомогою find_package) та працювати (модуль пошуку називається FindThreads):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})

2
Це не працює при використанні в проекті тільки для CXX. Хтось знає приємне рішення?
Саймон

1
@Simon трохи пізно , але дивіться це: stackoverflow.com/questions/15193785 / ...
congusbongus

@CongXu Дякую! Добре знати!
Simon Simon

1
Це рішення працює на Mac OS X, Centos 6 та Solaris 10.
bernardn


26

Ось правильна відповідь:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

дорівнює

-lpthread

Це рівнозначно. "-pthread" дарує набагато більше - при компіляції це -D_REENTRANT, в час посилання -lpthread. У деяких системах навіть може бути більше, ніж це.
димба

2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Надір SOUALEM

21
це рішення цеглиться, як тільки ви переходите з Linux на freebsd або windows.
Олексій

4
Не працює, "target_link_libraries (your_executable pthread)" - так це має бути написано.
Перебіг

6
Це не є правильною відповіддю будь-якими способами. Навіть якщо ви не любите відповідь будинку, і вважаючи, що це було написано в 2009 році, це абсолютно непересічна платформа. Використовуйте відповідь будинку - і якщо вам це не подобається, тоді займіться тим, що, як target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")мінімум, орієнтується на ціль і не виходить з ладу на Windows та інших платформах.
Ela782
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.