Jak zmusić cmake do włączenia opcji "- pthread " podczas kompilacji? [duplikat]

To pytanie ma już odpowiedź tutaj:

Wiem, że jest coś takiego jak find_package(Threads), ale to nie robi różnicy (przynajmniej samo w sobie). Na razie używam SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread"), ale dla mnie nie wygląda to na poprawne rozwiązanie.

3 answers

find_package( Threads ) wywołuje moduł CMake, który najpierw przeszukuje system plików w poszukiwaniu odpowiedniego pakietu wątków dla tej platformy, a następnie ustawia zmienną CMAKE_THREAD_LIBS_INIT(i kilka innych zmiennych). Nie nakazuje CMake ' owi łączenia plików wykonywalnych z biblioteką wątków, którą znajduje. Każ CMake 'owi połączyć się z biblioteką "Threads" poleceniem target_link_libraries(). Na przykład, powiedzmy, że twój program nazywa się test. Aby połączyć go z wątkami potrzebujesz do:

find_package( Threads )
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )
 40
Author: ltc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-23 08:33:45

Moduł wątków w najnowszych wersjach (>= 3.1) CMake generuje Threads::threads imported target . Linking your target against Threads:: Threads dodaje wszystkie niezbędne flagi kompilacji i łączenia. Można to zrobić tak:

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)

add_executable(test test.cpp)
target_link_libraries(test Threads::Threads)

Użycie importowanego celu jest wysoce zalecane dla nowego kodu, zgodnie z CMake docs

 18
Author: Alex Che,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-17 13:50:24

A może:

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
if(CMAKE_USE_PTHREADS_INIT)
    set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")
elseif(...)
    ...
endif()
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )
 6
Author: user3701085,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-02 22:52:39