Parece que, por exemplo, o CMake 3.0.2 não definirá THREADS_HAVE_PTHREAD_ARG se a biblioteca pthread for encontrada ( NOT CMAKE_HAVE_THREADS_LIBRARY), por exemplo, no Ubuntu 15.04 :(
mlt
1
A versão fornecida para o CMake 2.8.12+ não funcionará conforme o esperado, por causa de como o código funciona /usr/share/cmake-2.8/Modules/FindThreads.cmake(por exemplo, veja aqui apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) basicamente, THREADS_HAVE_PTHREAD_ARGé definido apenas se as outras variações da bandeira não foram encontrados (isto é. -lpthread, -lpthreadou -lthread)
j1elo
Isso fornece o erro "Não é possível especificar as bibliotecas de links para o destino" my_app ", que não é criado por este projeto." - como habilitá-lo universalmente sem precisar fazê-lo individualmente para cada alvo?
Chris Dodd
A primeira ainda é a maneira mais fácil em 2020 / cmake 3.17?
Jay
O que acontece se você não definir o sinalizador THREADS_PREFER_PTHREAD_FLAG, basta encontrar e vincular?
Jay
199
O seguinte deve estar limpo (usando find_package) e funcionar (o módulo de localização é chamado FindThreads):
Isso é equivalente. "-pthread" doa muito mais - na compilação é -D_REENTRANT, no tempo do link -lpthread. Em algum sistema no mesmo pode ser mais do que isso.
Dimba
2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM
21
essa solução funciona assim que você muda do linux para o freebsd ou windows.
7283 Alex
4
Não funciona, "target_link_libraries (your_executable pthread)" é como deve ser escrito.
Overv
6
Esta não é a resposta certa de forma alguma. Mesmo que você não goste da resposta da casa, e considerando que ela foi escrita em 2009, é uma plataforma completamente diferente. Use a resposta da casa - e, se você não gostar, escolha algo target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")que seja pelo menos baseado em metas e que não falhe no Windows e em outras plataformas.
Respostas:
@Manuel fazia parte do caminho. Você também pode adicionar a opção de compilador, assim:
Se você possui o CMake 3.1.0+, isso se torna ainda mais fácil :
Se você estiver usando o CMake 2.8.12+, poderá simplificar isso para:
As versões mais antigas do CMake podem exigir:
Se você quiser usar um dos dois primeiros métodos com o CMake 3.1+, será necessário
set(THREADS_PREFER_PTHREAD_FLAG ON)
também.fonte
NOT CMAKE_HAVE_THREADS_LIBRARY
), por exemplo, no Ubuntu 15.04 :(/usr/share/cmake-2.8/Modules/FindThreads.cmake
(por exemplo, veja aqui apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) basicamente,THREADS_HAVE_PTHREAD_ARG
é definido apenas se as outras variações da bandeira não foram encontrados (isto é.-lpthread
,-lpthread
ou-lthread
)O seguinte deve estar limpo (usando
find_package
) e funcionar (o módulo de localização é chamadoFindThreads
):fonte
Aqui está a resposta correta:
equivalente a
fonte
target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")
que seja pelo menos baseado em metas e que não falhe no Windows e em outras plataformas.