cmake와 libpthread


188

나는 중이에요 RHEL 5.1및 사용gcc .

컴파일 및 링크 cmake에 추가 -pthread하도록 하려면 어떻게 합니까?


1
이에 대한 답변을 선택할 수 있습니까?
Jared Burrows

1
친구, @ Manuel 's를 답으로 선택해야합니다.

@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)이 방법도 필요합니다 .


예를 들어 pthread 라이브러리가 발견되면 CMake 3.0.2가 THREADS_HAVE_PTHREAD_ARG를 설정하지 않는 것처럼 보입니다 ( 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 "에 대한 링크 라이브러리를 지정할 수 없습니다."오류가 발생합니다. -각 대상에 대해 개별적으로 수행하지 않고도 어떻게 보편적으로 사용할 수 있습니까?
Chris Dodd

첫 번째가 2020 / cmake 3.17에서 여전히 가장 쉬운 방법입니까?
Jay

THREADS_PREFER_PTHREAD_FLAG 플래그를 설정하지 않고 찾기 만하면 어떻게됩니까?
Jay

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

@CongXu 감사합니다! 알아 둘만 한!
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입니다. 일부 시스템에서는이 이상일 수도 있습니다.
dimba 2009

2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM 2009

21
이 솔루션은 Linux에서 freebsd 또는 windows로 변경하자마자 중단됩니다.
Alex

4
"target_link_libraries (your_ executable pthread)"가 작동하지 않습니다.
Overv

6
이것은 정답이 아닙니다. 집의 답변이 마음에 들지 않고 2009 년에 작성된 것으로 생각하더라도 완전히 교차하지 않는 플랫폼입니다. 집의 대답을 사용하십시오-마음에 들지 않으면 target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")적어도 대상 기반이며 Windows 및 기타 플랫폼에서 실패 하지 않는 것과 같은 것을 찾으십시오 .
Ela782
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.