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} )
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
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} )
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