【问题标题】:link pthread statically with cmake将 pthread 与 cmake 静态链接
【发布时间】:2017-01-26 22:58:25
【问题描述】:

如何让 CMake 在 Windows 上静态链接 pthread?我使用MSYS2 MinGW 32 bitcmake v3.7。

我想要实现的是像

这样的编译器调用
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_FLAGSpthreads 会包含在我的目标文件之前,因此不会解析符号。

【问题讨论】:

  • 一个澄清:1)当你说你想在Windows上静态链接pthread时,你的意思是产生一个静态库(测试将是一个静态库?)或者你想链接到pthread静态库?
  • @fedepad 我想生成一个链接到静态 pthread 的可执行文件(因为对 g++ 的更新调用会生成)

标签: cmake msys2


【解决方案1】:

找到Threads 模块:

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

文档中的注释:

对于多线程库的系统,调用者可以设置CMAKE_THREAD_PREFER_PTHREAD

【讨论】:

  • 添加该目标似乎不会更改链接器调用。 pthread没有出现在命令行(但是cmake根据CMakeCache.txt找到了://Have symbol pthread_create CMAKE_HAVE_LIBC_CREATE:INTERNAL=1 //Have include pthread.h CMAKE_HAVE_PTHREAD_H:INTERNAL=1
  • 感谢您的回答。看来target_link_libraries(ptest2 -static) 真的是这里所需要的。
【解决方案2】:

正如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)  

有帮助吗?

【讨论】:

  • 感谢您花时间回答。事实证明,target_link_libraries(test -static) 就是这个平台所需要的。
  • 很好,很高兴知道,因为我想我从未见过在 target_link_libraries() 中调用 -static...stackoverflow.com/questions/16991225/cmake-and-static-linking
  • 说文档:链接标志:项目名称以 - 开头,但不是 -l 或 -framework,被视为链接器标志。请注意,出于传递依赖的目的,此类标志将被视为任何其他库链接项,因此通常将它们指定为不会传播给依赖项的私有链接项是安全的。 ——这就是为什么我最初的尝试没有奏效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2023-03-05
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多