2017-01-26 13 views
2

Как я могу получить CMake для ссылки pthread статически на Windows? Я использую MSYS2 MinGW 32 bit и cmake v3.7.Ссылка pthread статически с cmake

То, что я хотел бы достичь, это компилятор призывание как

g++ -static-libgcc -static-libstdc++ -std=c++11 -o test test.cpp -Wl,-Bstatic -lpthread 

Установка

target_link_libraries(test PUBLIC "-Wl,-Bstatic -lpthread") 

результаты в -Wl,-Bdynamic -Wl,-Bstatic -lpthread называют. Если я изменяю CMAKE_EXE_LINKER_FLAGS, pthreads включен перед моими объектными файлами, и поэтому символы не разрешаются.

+0

Одно пояснение: 1) Когда вы говорите, что хотите связать pthread статически в Windows, вы хотите создать статическую библиотеку (тест будет статической библиотекой?) Или вы хотите связать статическую библиотеку pthread? – fedepad

+0

@fedepad Я хочу создать исполняемый файл, связанный со статическим pthread (поскольку обновленный вызов g ++ будет производить). – zeeMonkeez

ответ

0

найти Threads модуль:

find_package(Threads REQUIRED) 
add_executable(myApp main.cpp) 
target_link_libraries(myApp Threads::Threads) 

Примечание из документации:

Для систем с несколькими библиотеками нитей, вызывающий абонент может установить CMAKE_THREAD_PREFER_PTHREAD

+0

Добавление этой цели, похоже, не изменяет вызов компоновщика. 'pthread' не появляется в командной строке (но cmake находит его в соответствии с' CMakeCache.txt': '// Имеет символ pthread_create CMAKE_HAVE_LIBC_CREATE: INTERNAL = 1 // Включить pthread.h CMAKE_HAVE_PTHREAD_H: INTERNAL = 1' – zeeMonkeez

+0

Спасибо за ваш ответ. Кажется, действительно 'target_link_libraries (ptest2 -static)' все, что здесь нужно. – zeeMonkeez

1

Как FindThreads.cmake упоминание в его Исходный код:

# For systems with multiple thread libraries, caller can set 
# 
# :: 
# 
# CMAKE_THREAD_PREFER_PTHREAD 
# 
# If the use of the -pthread compiler and linker flag is preferred then the 
# caller can set 
# 
# :: 
# 
# THREADS_PREFER_PTHREAD_FLAG 
# 
# Please note that the compiler flag can only be used with the imported 
# target. Use of both the imported target as well as this switch is highly 
# recommended for new code. 

Так что в дополнение к уже сказанному вам может потребоваться установить дополнительный флаг THREADS_PREFER_PTHREAD_FLAG. В некоторых системах (OSX и т. Д.) Этот флаг требуется во время компиляции, потому что он определяет некоторые макросы, которые будут отсутствовать, если вы связываете только -lpthread.

set(CMAKE_THREAD_PREFER_PTHREAD TRUE) 
set(THREADS_PREFER_PTHREAD_FLAG TRUE) 
add_library(test test.cpp) 
set_property(TARGET test PROPERTY CXX_STANDARD 11) 
set_target_properties(test PROPERTIES LINK_SEARCH_START_STATIC 1) 
set_target_properties(test PROPERTIES LINK_SEARCH_END_STATIC 1) 
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") 
find_package(Threads REQUIRED) 

target_link_libraries(test Threads::Threads) 

Помогает ли это?

+0

Спасибо, что нашли время ответить. Оказывается, что 'target_link_libraries (test -static)' - это все, что нужно на этом платформе. – zeeMonkeez

+0

Приятно, приятно знать, как я думаю, я никогда не видел этого -статического вызова внутри target_link_libraries() ... http://stackoverflow.com/questions/16991225/cmake-and-static-linking – fedepad

+0

говорят, что docs: флаг ссылки: имена элементов, начинающиеся с -, но не -l или -framework, рассматриваются как флаги компоновщика. Обратите внимание, что такие флаги будут обрабатываться как любые другие li brary link для целей транзитивных зависимостей, поэтому они в целом безопасны указывать только как частные ссылки, которые не будут распространяться на иждивенцев. - вот почему моя оригинальная попытка не сработала. – zeeMonkeez