Eclipse CDT链接选项-静态libgcc-静态libstdc++不影响Windows上的行为



我是一名Java程序员,但我正在为我必须做的项目(JNI)自学一些C++。为此,我使用Eclipse和MinGW-GCC在C++中编写了一个非常简单的DLL测试程序。当我试图在Windows7(以及我身边的任何其他版本)上运行测试程序时,我遇到了一个错误,libgcc_s_dw2-1.dll丢失了。在阅读了SO上的其他一些问题后,我发现了我添加到项目设置中的-static libgcc和-static libstdc++链接器选项。在我添加静态选项之前,DLL和exe的文件大小非常小,添加它们之后,DLL和.exe要大得多,这让我相信DLL实际上已经包含在内了。然而,在尝试运行程序时,我仍然会遇到丢失的DLL错误。如果我将DLL复制到与exe相同的文件夹中,那么它就会运行。我读到一些建议,说应该单独分发DLL,但这远非理想,如果可能的话,我想避免它。

我也尝试过只使用-static链接器选项,但由于某种原因,当我这样做时,编译器找不到我的简单DLL。如果我删除-static,它可以再次找到它,一切都很好。我不确定这是怎么回事,但也许这与整体问题有关?

我已经阅读了关于这个主题的所有内容,似乎我做的是正确的,DLL正在静态链接到exe,但在运行时没有效果。我无计可施。如有任何建议,我们将不胜感激。

谢谢,Pablo

更新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错误。当我用DependencyWalker检查EXE和DLL时,它清楚地显示出对这两个C库没有依赖关系。然而,当我运行EXE窗口时,说C++库不见了。如果我将库的副本与DLL和EXE放在同一个文件夹中,那么程序运行良好。

实际丢失的DLL是libgcc_s_dw2-1.DLL。如果我将该DLL的副本放在EXE文件夹中,则丢失的DLL为libstdc++-6.DLL。

好的,我终于解决了这个问题。我切换到使用-static,而不使用特定的-static-libgcc和-static-libstdc++选项。当我这样做的时候,我的EXE编译开始给我错误,它找不到我的hellodll,尽管它仍然在同一个地方。我又在谷歌上搜索了一下,发现我需要编译这个库,最终得到.a或.so而不是.dll。在Eclipse CDT中,我发现在C/C++构建/设置/构建工件选项卡下,工件类型设置为"共享库"。我把它换成了静态库,编译了DLL,重新编译了EXE,一切都正常了。

对于使用eclipse for c/c++但运行*.exe文件并得到错误的windows用户非常有用:"missing libstdc++6.dll"

的4种解决方法

  1. Eclipse->"Project"->"Properties"->"C/C++Build"->"Settings"->"Tool Settings"->《MinGW C++Linker》->"Misscellaneous"->"Linker flags"(添加"-static")

  2. 将"{{安装MinGW的路径}}/bin"添加到Windows中的当前用户环境变量"path"中,然后重新启动eclipse,最后重新编译。

  3. 将"{{安装MinGW的路径}}/bin"添加到Windows环境变量"path"中,然后重新启动eclipse,最后重新编译。

  4. 将文件"libstdc++-6.dll"复制到运行*.exe文件的路径,然后重新运行。(这不是一个好方法)

注意:文件"libstdc++-6.dll"位于文件夹"{{安装MinGW的路径}}/bin"中

最新更新