我是一名Java程序员,但我正在为一个我必须做的项目(JNI)自学一些C ++。为此,我使用Eclipse和MinGW GCC在C ++中编写了一个非常简单的DLL和一个非常简单的DLL测试程序。当试图在Windows 7(以及我周围的任何其他版本)上运行测试程序时,我收到了libgcc_s_dw2-1.dll缺失的错误。在阅读了关于SO的其他一些问题后,我发现了我添加到项目设置中的-static-libgcc和-static-libstdc ++链接器选项。在添加静态选项之前,DLL和exe的文件大小非常小,并且在添加它们之后,DLL和exe都要大得多,这使我相信DLL实际上被包含在内。但是,在尝试运行程序时,我仍然会收到丢失的DLL错误。如果我将DLL复制到与exe相同的文件夹,则它会运行。我读了一些建议,说人们应该单独分发DLL,但这远非理想,我想尽可能避免使用它。
我也试过使用-static链接器选项,但出于某种原因,当我这样做时,编译器找不到我的简单DLL。如果我删除-static它可以再次找到它就好了。我不确定那是什么,但也许它与整体问题有关?
我已经阅读了关于这个主题的所有内容,似乎我正在做正确的事情,并且DLL正在静态链接到exe,但它在运行时没有效果。我的智慧结束了。任何建议都将不胜感激。
谢谢, 巴勃罗
更新1 我想我不是很清楚。问题是,即使我静态链接它们,Windows仍然说C库已经丢失了。当我运行构建时,这些是运行的编译和链接器命令:
g++ "-IC:\\_projects_eclipse\\bcsdll\\src\\" "-includeC:\\_projects_eclipse\\bcsdll\\src\\bcsdll.h" -O0 -g3 -Wall -c -fmessage-length=0 -o Main.o "..\\Main.cpp"
g++ "-LC:\\_projects_eclipse\\bcsdll\\Debug" -Wl,-enable-stdcall-fixup -static-libgcc -static-libstdc++ -o bcsdll_tester.exe Main.o -lbcsdll
问题是,即使我在运行EXE时静态包含两个C库,我仍然会在C库中找到丢失的DLL错误。当我使用Dependency Walker检查EXE和DLL时,它清楚地表明不依赖于两个C库。然而,当我运行EXE窗口时,表示缺少C ++库。如果我将库的副本与我的DLL和EXE放在同一个文件夹中,那么程序运行正常。
实际丢失的DLL是libgcc_s_dw2-1.dll。如果我将该DLL的副本放在EXE文件夹中,则缺少的DLL是libstdc ++ - 6.dll。
答案 0 :(得分:1)
好的,我终于解决了这个问题。我转而使用-static而没有特定的-static-libgcc和-static-libstdc ++选项。当我这样做时,我的EXE编译开始给我错误,即使它仍然在同一个地方,它也找不到我的hellodll。还有一些谷歌搜索,我发现我需要编译库以最终得到.a或.so而不是.dll。在Eclipse CDT中,我在C / C ++ Build / Settings / Build Artifact选项卡中找到了Artifact Type设置为" Shared Library"。我把它切换到静态库,编译DLL,重新编译EXE,一切正常。
答案 1 :(得分:0)
对使用eclipse for c / c ++但运行* .exe文件并显示错误的Windows用户有用:“缺少libstdc ++ 6.dll”
4种解决方法
Eclipse->“项目”->“属性”->“ C / C ++构建”->“设置”->“工具设置”->“ MinGW C ++链接器”->“其他”-> “链接器标志”(向其添加“ -static”)
将'{{您的MinGW的安装路径}} / bin添加到当前用户环境变量-Windows中的“路径”,然后重新启动Eclipse,最后重新编译。
将'{{您的MinGW的安装路径}} / bin添加到Windows环境变量-“路径”,然后重新启动Eclipse,最后重新编译。
将文件“ libstdc ++-6.dll”复制到运行* .exe文件的路径,然后重新运行。 (这不是一个好方法)
注意:文件“ libstdc ++-6.dll”位于文件夹“ {{您的MinGW的安装路径}} / bin”中