2012-12-24 31 views
5

我已经阅读了这两个SO问题:Which runtime libraries to ship?License of runtime libraries included in GCC? - 这两个都非常有帮助,但不是我所期待的。发货运行时库/ DLL的要求

我一直只是写自己的机器上使用的程序,它从来没有造成任何问题,但现在我想开始在其他机器上运行软件,并对运行时要求保持警惕。

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

具体来说,如果我写在Windows机器上的C++程序,通过MinGW的GCC编译,并想在另一台机器上运行它:

  • 我一定要送的libstdC++。与我的程序的DLL?
  • 这个单个文件(我假设放在可执行文件的目录中)足以让程序运行吗?

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

我习惯于在安装了开发工具等的机器上运行程序,但现在我正在寻找在通用机器(朋友,同事等)上运行它们,而我并不完全确定要做什么!


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

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

比方说,我已经写,其具有从对象C++,C和/或目的-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

加载DLL时,Windows看起来第一个地方是该exe文件所在的目录。所以它可能会很好地将DLL放在那里。

对于Microsoft DLL,我认为让你的同事安装Visual C++运行库(这是Microsoft的可再发行组件包)更有意义。理想情况下,您可以使用类似WiX的安装程序进行安装,并且会为您安装该先决条件,但只要告诉您的同事这样做就可以了。

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

+1

对于win8商店应用程序看到这个.. http://blogs.msdn.com/b/vcblog/archive/2012/09/28/10354327.aspx –

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,则即使A不直接依赖C,B也可能依赖于C) 。

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

更新:作为xtofl指出,这将不包括库动态加载使用LoadLibrary。如果您想要涵盖此基础,请使用进程监视器来检查运行该应用程序时触及的DLL文件。 (添加一个'图像路径'标准以及EXE的路径,以避免被泛滥。)这还有一个优点,它涵盖了应用程序依赖的所有文件,注册表项等,而不仅仅是DLL。

+0

'depends'将产生静态加载的二进制文件。装载有例如'LoadLibrary(...)'将被错过,但是这些都在你的控制之下 – xtofl

+1

最好的方法是不使用depends。最好的方法是从头开始了解您的应用程序依赖关系。阅读编译器文档将是需要的。 –

+0

您也可以从Dependency Walker(Profile-> Start Profiling)中运行您的应用程序。然后它将使用在运行时实际加载的库更新视图。 –