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

问题描述 投票:0回答:2

我是一名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。

c++ gcc dll eclipse-cdt mingw32
2个回答
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,一切正常。


0
投票

对于使用eclipse进行c / c ++但运行* .exe文件并出错的windows用户很有用:“缺少libstdc ++ 6.dll”

4种解决方法

  1. Eclipse - >“Project” - >“Properties” - >“C / C ++ Build” - >“Settings” - >“Tool Settings” - >“MinGW C ++ Linker” - >“Miscellaneous” - >“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”

© www.soinside.com 2019 - 2024. All rights reserved.