我尝试使用静态链接工具链库构建程序。 我通过了:
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/
答案 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}>)