问题描述
我已经使用SFML库用c ++编写了一个应用程序。我将其配置为代码块以运行程序。假设我现在想将此应用程序发送给我的朋友,我能做到的最好的方法是什么,这样他就不必下载很多东西来运行它?
我正在使用MinGW编译器。
解决方法
创建安装程序或软件包。例如;在RedHat Linux上,您想创建一个RPM软件包。在Windows上,您想创建一个MSI文件。无论您做什么,创建的软件包都应捆绑应用程序运行所需的所有内容,并将其放入目标系统上的正确位置。这包括可执行文件,也包括您使用的任何库(包括编译器运行时库)。
,在大多数情况下,仅交付您的.exe及其所有依赖项就足够了。 在某些情况下,您可能还需要附带运行该应用程序所需的其他文件,例如配置文件,图像,图标...
您可以将copypedeps
与https://github.com/brechtsanders/pedeps中的-r
标志一起使用,以将.exe及其依赖的.dll文件复制到一个空文件夹中。
然后,您可以将所有内容压缩到该文件夹中,然后将其发送给可以解压缩并运行.exe的人。
或者您可以制作一个适当的安装程序来分发相同的文件。
,您的程序需要运行一些.dll
:一些是系统的,一些是编译器附带的,有些来自您使用的库(SFML)。您需要将所有.dll
(系统的除外)与.exe
一起运输,并且它们应该位于同一目录中。
创建适当的安装程序或向您的朋友发送zip存档并不重要。 (如果是存档,则他们可能必须在运行.exe
之前手动将其提取。)
问题是如何确定要发货的.dll
。有几种方法:
-
打开控制台,
cd
到.exe
所在的位置,执行set PATH=
并尝试通过键入可执行文件的名称来运行该可执行文件。由于编译器安装不再位于PATH
中,因此不应在其中看到.dll
,并且应该抱怨它们丢失。提供一个.dll
后,它将要求下一个。 -
更文明的方法是使用
ntdll
之类的工具来列出您的应用使用的所有.dll
。然后复制它们,忽略系统的(位于C:\Windows
或子目录中)。
请注意,两种方法都依赖于.dll
或子目录中没有无关的C:\Windows
;一些写得不好的安装程序喜欢在其中放置自己的.dll
。要进行检查,请列出编译器随附的所有.dll
(它们应与gcc.exe
放在同一目录中)以及来自库(SFML)的列表。然后在.dll
和子目录中查找具有相同名称的C:\Windows
,然后删除它们。