9

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

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

但程序与 shared 链接libwinpthread-1.dll

我做错了什么?

只有当我得到静态链接的 libwinpthreads 时,才能传递-staticLDFLAGS. 但它破坏了带有插件系统的构建程序。

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

4

3 回答 3

9

尝试这个:

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

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

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

于 2015-01-17T15:55:03.877 回答
0

你没有做任何不正确的事情,Mingw-Builds 就是这样工作的。

我最近偶然发现了这一点,但还有一个原因:

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

就我而言,问题是我在同一个系统上有多个 GCC 包,因此我没有将它们添加到 PATH 以避免名称冲突。

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

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

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

如果你使用 mingwbuilds 你必须链接到 pthreadBLAH.dll 没有解决方法

于 2014-11-28T14:37:03.723 回答
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}>)
于 2015-04-15T19:15:41.783 回答