【问题标题】:Eclipse CDT Link Options -static-libgcc -static-libstdc++ Not Affecting Behavior on WindowsEclipse CDT 链接选项 -static-libgcc -static-libstdc++ 不影响 Windows 上的行为
【发布时间】:2015-06-04 04:09:23
【问题描述】:

我是一名 Java 程序员,但我正在自学一些 C++,用于我必须做的项目 (JNI)。为此,我使用 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。

【问题讨论】:

  • 我应该补充一点,我还下载了 Dependency Walker,根据该程序,当我使用链接器选项编译时,对 C 和 C++ 库没有依赖关系,但是当我没有它进行编译时,依赖关系会出现.我猜 Windows 很笨,但我在几个不同的系统上尝试过,并且在所有系统上都遇到了相同的错误。
  • 你能告诉我们makefile或编译标志对话框的内容吗?
  • 我不确定在哪里可以找到 makefile,因为它似乎大部分是由 IDE 自动完成的。您具体指的是哪个编译对话框?好像有好几个。在 C/C++ Build/GCC C++ Compiler/All Options 框下它有这个: -I"C:\_projects_eclipse\bcsdll\src\" -include"C:_projects_eclipse\bcsdll\src\bcsdll.h" -O0 -g3 -Wall -c -fmessage-length=0 请注意,在 -include"C:... 之后实际上有一个 \,它似乎没有出现在网站上。
  • 传递给链接器的那些。还有一些关于“编译器找不到我的简单 DLL”的详细说明。会有帮助的。
  • 嗯,这不是主要问题。这是一个旁白,以防它可能相关。我要解决的是为什么即使我静态地包含 C 和 C++ 库,当我运行程序时我仍然收到库不可用的错误。

标签: c++ gcc dll eclipse-cdt mingw32


【解决方案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,一切正常。

【讨论】:

    【解决方案2】:

    对使用 eclipse for c/c++ 但运行 *.exe 文件并得到错误的 Windows 用户有用:“缺少 libstdc++6.dll”

    4 种方法来解决它

    1. Eclipse ->“项目”->“属性”->“C/C++ 构建”->“设置”->“工具设置”->“MinGW C++ 链接器”->“杂项”-> “链接器标志”(添加“-static”)

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

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

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

    注意:文件“libstdc++-6.dll”在文件夹'{{安装MinGW的路径}}/bin'

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2015-10-04
      • 2012-10-21
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2012-12-22
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多