运送运行时库/ DLL的要求

时间:2012-12-24 02:12:15

标签: c++ gcc dll runtime mingw

我已经阅读了这两个问题:Which runtime libraries to ship?License of runtime libraries included in GCC? - 两者都非常有用,但不是我想要的。

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

编辑:请参阅下面的示例,这是误导性的。

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

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

另外,一个相同的例子,除了这次它是一个Objective-C程序。是否将libobjc.dll文件发送到足以允许程序正常执行的其他计算机?

我习惯在安装了开发工具等的机器上运行程序,但现在我想在通用机器(朋友,同事等)上运行它们,我不太清楚是什么要做!


编辑:为了回应大厦的回答,我觉得我应该澄清一下我在寻找什么。我知道如何识别我的程序使用的必要的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一起传输?

基本上我正在尝试确定在系统运行时要求方面在另一台机器上开发和运行应用程序的整个思维过程。

2 个答案:

答案 0 :(得分:5)

加载DLL时,Windows看起来的第一个位置是exe所在的目录。因此将DLL放在那里可能会正常工作。

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

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

答案 1 :(得分:3)

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

确定应用程序附带内容的最佳方式是将EXE加载到Dependency Walker等程序中。

就像一个例子,我编译了一个测试C ++程序,它只打印一个std :: string。 As you can see,它直接依赖于两个模块,而不是Windows附带的模块; libgcc_s_dw2-1.dll以外的libstdc++-6.dll

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

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

更新:由于 xtofl 指出这不会涵盖使用LoadLibrary动态加载的库。如果要覆盖此基础,请使用Process Monitor检查运行应用程序时触摸的DLL文件。 (在EXE的路径中添加“图像路径”标准,以免被淹没。)这样做的另一个好处是它涵盖了应用程序所依赖的所有文件,注册表项等,而不仅仅是DLL。