6

我已经阅读了这两个 SO 问题:要发布哪些运行时库?GCC 中包含的运行时库的许可证?- 两者都非常有帮助,但不是我想要的。

我一直只是编写在自己的机器上使用的程序,这从来没有给我带来任何问题,但是现在我想开始在其他机器上运行软件并且我对运行时要求很谨慎。

编辑:请参见下面的示例,这具有误导性。

具体来说,如果我在 Windows 机器上编写 C++ 程序,通过 MinGW 使用 gcc 编译,并希望在另一台机器上运行它:

  • 我必须将 libstdc++.dll 与我的程序一起发送吗?
  • 这个单个文件(我假设放在可执行文件的目录中)是否足以让程序运行?

还有一个相同的例子,只不过这次是一个 Objective-C 程序。将 libobjc.dll 文件发送到另一台机器是否足以让程序正常执行?

我习惯于在安装了开发人员工具等的机器上运行程序,但现在我希望在通用机器(朋友、同事等)上运行它们,我不太确定该怎么做!


编辑:回应edifice的回答,我觉得我应该澄清我在寻找什么。我知道如何识别我的程序使用的必要 DLL(/dylibs 等)(尽管我习惯于手动完成这项工作;我没有听说过任何工具)。我的问题更多的是“我现在该怎么办?”

可能需要一个更一般的例子:

假设我编写了一个程序,该程序具有从 C++、C 和/或 Objective-C(2) 代码派生的目标文件。我使用了一些使用 MinGW 的 gcc 成功编译的 Windows API 代码。我还有一个在 Visual Studio (C++) 中编写的自定义 DLL。

我已经确定了我的程序将在运行时使用哪个 DLL(其中一个可能是 GCC 的 libobjc.dll,我不确定这是否会/应该在 Windows 机器上有所作为,但我想让它尽可能通用) - “必备 DLL ”。

我想在我同事的计算机上运行它,其中大多数运行 Windows 7,但现在有些运行 Windows 8。为了完整起见,从一开始就开始:

  • 我需要将必备的 DLL传输到我同事的计算机吗?
  • 我应该将它们放在什么目录中?(exe目录/系统目录?)
  • 一旦到位,这些 DLL 的存在是否允许程序正确执行?(假设它知道在哪里可以找到它们)
  • 是否有任何其他文件应与 DLL 一起传输?

基本上,我试图根据系统运行时要求确定在另一台机器上开发和运行应用程序的整个思考过程。

4

2 回答 2

5

加载 DLL 时,Windows 会首先查看 exe 所在的目录。因此,将 DLL 放在那里可能会很好。

不过,对于 Microsoft DLL,我认为让您的同事安装 Visual C++ 运行时更有意义,它是 Microsoft 的可再发行包。理想情况下,您会使用 WiX 之类的东西制作安装程序,它会为您安装该先决条件,但只需告诉您的同事就可以了。

如果您包含来自 gcc 的 DLL,请务必在您的软件中包含许可证文件,因为 GPL 需要它。

于 2012-12-29T08:53:33.050 回答
3

libstdc++ 不一定足够。您几乎肯定也需要 libgcc,但实际依赖项可能会因您的特定应用程序而异。

确定您需要随应用程序提供什么的最佳方法是将您的 EXE 加载到Dependency Walker之类的程序中。

举个例子,我编译了一个测试 C++ 程序,它只打印一个 std::string。如您所见,它直接依赖于Windows自带的两个模块之外的模块;libgcc_s_dw2-1.dll除了libstdc++-6.dll.

您应该记住在每个 DLL 下展开树,以确保它本身没有任何其他依赖项(如果 A 依赖于 B,即使 A 不直接依赖于 C,B 也可能依赖于 C)。

如果您担心并希望得到最有力的保证,您可以将 Windows 安装到虚拟机中(VirtualBox 是免费的)并在其中测试您的应用程序。如果您使用 Microsoft API,您可能希望查看 MSDN 文档以了解它们引入的 Windows 版本,并确保它与您的目标最低 Windows 版本一致。

更新:正如xtofl指出的那样,这不会涵盖使用动态加载的库LoadLibrary。如果您想覆盖此基础,请使用进程监视器检查运行应用程序时触及的 DLL 文件。(在 EXE 的路径中添加一个“图像路径”标准,以免被淹没。)这具有额外的优势,它涵盖了您的应用程序所依赖的所有文件、注册表项等,而不仅仅是 DLL。

于 2012-12-27T07:48:50.100 回答