如何使程序在其他计算机上运行?
How to make a program run on other computers?
我用 c++ 和 Allegro 5 做了一个游戏,它在我装有 Linux 的电脑上运行良好。我想知道如何创建一个可以导出到另一台 Linux 计算机的软件包,并在不安装 Allegro 的情况下使其运行。谢谢
我刚才必须弄清楚这一点,以下是基于对我有用的步骤的指南。很可能有一种"更好"的方式来静态链接到 allegro。
首先,您需要 allegro 的静态库。如果您的发行版 不打包这些,你必须自己构建它们:
- 克隆源代码(假设您将其克隆到名为
allegro
的目录中)。 - 创建构建目录:
cd allegro && mkdir build && cd build
cmake .. -DSHARED=off
.这指定了我们想要静态(非共享)库make
- 现在,您应该在构建目录中的
lib
下看到以.a
扩展名结尾的库。
现在你可以像这样链接到静态库:
gcc main.c -o main -Lpath/to/allegro/build/lib -lallegro-static
除非您在标准库路径中安装静态库(例如/usr/lib) 您需要-L
参数为链接器提供指向 刚刚构建的静态库。
如果您只是尝试上述操作,您会注意到许多链接器错误到其他 图书馆。静态链接时,需要手动指定链接器 标志到 Allegro 的依赖项。老实说,我不记得这是为什么,但是 我只知道我必须这样做。
若要确定这些依赖项,请尝试使用共享的 图书馆:
gcc main.c -o main -lallegro
然后在生成的二进制文件上运行ldd
(main
)。您应该看到类似以下内容:
linux-vdso.so.1 (0x00007fff1dbfd000)
liballegro.so.5.2 => /usr/lib/liballegro.so.5.2 (0x00007f8b802ea000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f8b7ff4c000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f8b7fc48000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f8b7fa2b000)
...
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f8b7c551000)
将其中每个都转换为链接器标志,最终命令将如下所示:
gcc main.c -o main -lallegro -lm -lpthread -lX11 ...
你会注意到你不必链接到ldd
输出中的所有内容,你 可以使用它来查找所需的最小链接器标志集。您将需要 如果要链接到其他模块,则使用更多链接器标志。例如,链接lallegro_audio-static
将需要像-lpng
这样的标志才能链接到PNG 图书馆。
最终,你会发现一组标志,让你静态链接到 快板。若要检查结果,请在静态链接的二进制文件上运行ldd
;你 应该注意到allegro
不再包含在输出中,因为用户会 不再需要动态链接到 Allegro。
Allegro 的答案对于任何库都是相同的。它没有任何特别之处。上一张海报的答案涉及实现细节,所以我将从 10,000 英尺的角度来介绍它:
对于任何库,您有三个选项。
-
静态编译库。
-
"动态"编译库,并将 Allegro 库文件随程序一起提供。(*.DLL 对于 Windows,*。SO "共享对象"文件适用于 Linux。这些文件与您正在执行的二进制文件位于同一目录中。
-
"动态"编译库,与以前相同,但依赖于已在系统上的系统目录中安装的库。(例如,Windows\System32)
在第一种情况下,库代码以物理方式添加到程序中。
第二种情况和第三种情况是相同的,只是您用它打包了什么。您的程序已编译(但不包含 Allegro 库代码),并被告知它将在运行库后"找到"该库。启动时,运行时链接器(Linux 中的 LD,有关更多信息的运行man ld)获取代码的所需符号(外部函数和全局变量)列表,检查起始目录中是否有合适的匹配库,如果没有,则检查其他系统目录。
第二种情况将所需的文件与程序放在一起。
第三种情况依赖于已经安装的所需文件,或者附带外部"运行时分发"安装程序,Microsoft经常这样做。(DirectX 运行时、Visual C++ 运行时等)
因此,由于您的目标是Linux,因此可以使用第一种或第二种情况。将特定版本的 Allegro 编译到代码中,或者随代码一起提供所需的版本。第二种情况的优点是,您可以在以后更改 DLL/SO 文件,而无需编译(对于补丁/错误修复),如果您有多个可执行文件,则只需要一组库代码。
应该注意的是,并非所有库都允许您(因为它们的许可证)将二进制文件包含在程序中。这就是为什么您经常会看到"Microsoft可再发行组件"。但是,Allegro 的许可证并不在乎。
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 在另一台计算机中运行 GTKMM 代码时未定义的符号
- 在计算机级别,应用程序以二进制方式运行,然后当发生运行时错误时,它如何呈现回错误代码
- 这是否有意义,我的计算机只能并行运行4个线程
- 致命错误LNK1112:通过 vcvarsall .bat x86 运行构建'X86'模块计算机类型'x64'与目标计算机类型冲突
- Visual C 程序不在其他计算机中运行
- 构建计算机上的C++运行时版本与客户计算机
- 从另一台计算机运行opencv可执行文件
- 作为服务运行时连接到远程计算机的 WMI
- 有什么好方法可以指示计算机是否可以运行特定的程序/软件
- 在云计算机〔Azure〕上运行OpenCV代码
- 两台计算机必须有什么共同点才能运行相同的可执行文件
- 如何在另一台计算机(linux)上使用OpenCV运行c++库
- 我的应用程序"Qt"在我的计算机中运行,但在我朋友的计算机上无法运行
- 计算机视觉-在TensorFlow上运行C++inception-v3时出现非法指令错误
- 是否可以在多核计算机的单核上运行多线程应用程序
- 我的程序不能运行与计算机没有VS MSCR100D.dll丢失