使用MinGW进行编译时,我必须在exe运行之前从MinGW bin目录复制某些dll文件(即使使用“-static”和/或“-static-libstdc ++”)。 我该如何改变?我必须使用MinGW的特殊版本吗?最终我希望能够运行该程序,只需要在目录中的exe(并且没有设置windows环境变量)。这些文件是:
以下是我休闲的步骤的完整列表:
查看消息
Hello World!
修改 我的命令行是:
g++.exe -Wall -fexceptions -static -static-libgcc -static-libstdc++ -g -static-libgcc -static-libstdc++ -L. -c "C:\Users\______\Desktop\Hello World\main.cpp" -o obj\Debug\main.o
g++.exe -o "bin\Debug\Hello World.exe" obj\Debug\main.o
需要上面提到的所有dll文件。并且,为了安全起见,代码是:
// main.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
return 0;
}
答案 0 :(得分:40)
你的命令错了!
转到 main.cpp 文件所在的目录,然后尝试以下操作。
g++.exe -Wall -c -g main.cpp -o obj\Debug\main.o
g++.exe -static -static-libgcc -static-libstdc++ -o "bin\Debug\Hello World.exe" obj\Debug\main.o
然后您将不再需要复制DLL(用于您的Hello World程序)。
其他说明:
MinGW安装说明建议设置
c:\minGW;c:\MinGW\bin;
到PATH环境变量。
通常是
-static -static-libgcc -static-libstdc++
链接器选项应该有效(一次尝试所有3个)。但不适用于libwinpthread-1.dll
。
另外,在重新编译之前尝试clean
。
没有“-static-something”命令。
只能将标准库 libgcc 和 libstdc ++ 设置为静态链接。
对于其他库,首先使用“-static”切换到静态链接,然后列出要包含单独命令的库,即“-lpthread”。
Cmake用户应尝试添加:
set(CMAKE_CXX_STANDARD_LIBRARIES "-static-libgcc -static-libstdc++ -lwsock32 -lws2_32 ${CMAKE_CXX_STANDARD_LIBRARIES}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive")
答案 1 :(得分:8)
-static-libgcc
可能是一个坏主意。 link options documentation表示
应用程序应该使用多种情况 共享libgcc而不是静态版本。其中最常见的 当应用程序希望抛出并捕获异常时 不同的共享库。在那种情况下,每个库都为 以及应用程序本身应该使用共享的libgcc。
答案 2 :(得分:0)
人们仍然陷于这个问题,在Code :: Blocks中尝试重建项目。我遇到了同样的问题,但是重建项目有助于解决问题。
答案 3 :(得分:0)
上述答案的注释包含完整的解决方案,因此我只想添加 CodeBlocks 透视图。我在 Windows7 x64 上使用 CodeBlocks16 和 MinGW-W64 8.1.0 ''i686-posix-dwarf'' 验证了它。
这解决了 OP 的问题
创建新项目并将其命名为“Hello World”
接受向导中的所有默认设置
选择 Project/BuildOptions/ 并选择“Hello World”。 Out 编辑对 Debug 和 Release 均有效
在“链接器”选项卡的“其他链接器选项”中添加以下内容
-static
-static-libgcc
-static-strc++
-lwinpthread
在工具栏上选择“调试”并按构建(黄色齿轮图标)
按下绿色运行图标并确认构建正常
测试
您也可以从资源管理器窗口启动它并确认它也不会要求 DLL。
注意:在我的 Win7x64 系统上,当从资源管理器启动 HelloWorld.exe 时,添加“-lwinpthread”行会导致 CodeBlocks 忽略“Projects/Properties/Tab_BuildTargets/”中的设置“执行结束时暂停”。所以“Hello World”输出几乎不可见,因为窗口在执行后立即关闭(也许有人知道为什么)
请注意,如果您没有遇到 winpthread.dll not found 问题,那么您可能不会使用带有“posix”的 MinGW-W64 编译器线程模型。两个代码块 MinGW-W64 捆绑安装包都使用这样的版本。对于 CB20.03,来自 MinGW-W64 download page 的相关下载为
例如,如果我直接使用 Codeblocks 设置安装编译器并选择 32 位编译器包“i686-win32-dwarf”,则只有前 2 个 DLL 会丢失。在这种情况下,修复方法是将链接器选项仅设置为
-static-libgcc
-static-strc++