【发布时间】: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