2013-02-02 122 views
9

我尝试使用静态链接工具链库生成程序。 我传递:静态链接libwinpthread

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

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

我做错了什么?

当我得到静态链接libwinpthreads的唯一方法是通过-staticLDFLAGS。但它打破了插件系统的构建程序。

我使用的MinGW-W64 + GCC-4.7.2从MinGW的,建立项目:http://sourceforge.net/projects/mingwbuilds/

+1

我不知道为什么'-Bstatic'选项似乎并没有工作,但你也许可以得到你想要的东西通过指定特定的库文件,而不是让'ld'寻找它:HTTP ://stackoverflow.com/a/14494371/12711 –

+2

在我的MinGW发行版中,静态存档被称为'libpthread.a'(是的,动态的也是'libwinpthread-1.dll'),因此我宁愿使用'-lpthread'。对你来说可能同样有效。 –

+0

[如何在mingw中执行libwinpthread-1.dll的静态链接?](https://stackoverflow.com/questions/13768515/how-to-do-static-linking-of-libwinpthread-1-dll -in-mingw) –

回答

1

你没有做任何事情不正确,MinGW的,构建工程这样你。

我最近无意中发现了这一点,但还有另一个原因:

自动MinGW的,构建链接可执行文件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的temp目录不起作用,因为CMake的清理该目录在每个配置..

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

7

试试这个:

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

通知之-lstdc++之前-lpthread。它为我工作。

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

+0

为我工作:gcc 4.9.2在x64 – cap

+0

为什么-lstdC++之前-lpthread我们已经有了-static-libstdC++ ?? –

+0

@ kawing-chiu我不知道。它只是起作用,如果我改变它的顺序,它就会中断。 ;-) –

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}>)