与libwinpthread静态链接

时间:2013-02-02 19:37:04

标签: mingw static-linking mingw-w64

我尝试使用静态链接工具链库构建程序。 我通过了:

LDFLAGS="-Wl,-Bstatic -lwinpthread -Wl,-Bdynamic -static-libgcc -static-libstdc++"

但程序与共享libwinpthread-1.dll相关联。

我做错了什么?

当我获得静态链接的libwinpthreads时,只有-static传递给LDFLAGS。但它打破了插件系统的构建程序。

我使用MinGW-builds项目中的mingw-w64 + GCC-4.7.2:http://sourceforge.net/projects/mingwbuilds/

3 个答案:

答案 0 :(得分:7)

试试这个:

-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic

请注意-lstdc++之前的-lpthread。它对我有用。

确保将其添加到g++命令行的最后。

答案 1 :(得分:0)

你没有做任何不正确的事,Mingw-Builds就像你一样。

我最近偶然发现了这一点,但出于另一个原因:

Mingw-Builds自动将可执行文件链接到GCC动态库(libwinpthread-1.dll, libstdc ++ - 6.dll,libgcc_s_dw2-1.dll)来保存可执行文件的大小(问题:当你发布可执行文件时,你必须记住添加丢失的dll以及你的二进制文件,因为不能保证用户在他们的文件上有这些DLL系统)

在我的情况下,问题是我在同一系统上有多个GCC pakcages,因此我没有将它们添加到PATH以避免名称冲突。

有趣的是,在配置项目之前,CMAKE会生成一个C-SourceFile,它被编译并用于获取有关编译器的信息,因为DLL不在PATH中,由于缺少DLL而导致CMake生成的小型可执行文件崩溃这阻止了整个构建过程。

解决方法是将编译器路径添加到PATH TEMPORARILY(或者更好地在另一个环境中运行CMake)。

手动将DLL添加到Cmake临时目录中并不起作用,因为Cmake会清理每个配置中的目录..

如果您使用mingwbuild,则必须链接到pthreadBLAH.dll没有解决方法

答案 2 :(得分:0)

不理想但如果您不介意将运行时DLL与可执行文件放在同一目录中,则可以在CMakeLists.txt文件中添加类似的内容。这会将必需的DLL从MingW bin目录复制到当前的构建目录中。

# ...
# change to name of your project
set(TARGET_NAME ${PROJECT_NAME})
# change to path to your minw bin directory
set(MINGW_BIN_PATH "C:\\Program Files\ \(x86\)\\mingw-w64\\i686-4.9.2-posix-dwarf-rt_v3-rev1\\mingw32\\bin")

set(LIBGCC_DLL "${MINGW_BIN_PATH}\\libgcc_s_dw2-1.dll")
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy
                   ${LIBGCC_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>)
set(LIBSTDCPP_DLL "${MINGW_BIN_PATH}\\libstdc++-6.dll")
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy
                   ${LIBSTDCPP_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>)
 set(LIBWINPTHREAD_DLL "${MINGW_BIN_PATH}\\libwinpthread-1.dll")
 add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    ${LIBWINPTHREAD_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>)