我使用c ++和Allegro 5制作了一款游戏,它可以在我的电脑上运行得很好。我想知道如何创建一个可以导出到另一台Linux计算机的软件包,并使其在不安装Allegro的情况下运行。感谢
答案 0 :(得分:1)
我不得不在不久之前解决这个问题,接下来是基于对我有用的步骤的指南。可能会有一个更好的"静态链接到快板的方式。
首先,您需要为allegro提供静态库。如果你的发行版 没有打包这些,你必须自己构建它们:
allegro
的目录中)。cd allegro && mkdir build && cd build
cmake .. -DSHARED=off
。这指定我们需要静态(非共享)库make
.a
下看到以lib
扩展名结尾的库。现在您可以链接到静态库,如下所示:
gcc main.c -o main -Lpath/to/allegro/build/lib -lallegro-static
除非您在标准库路径中安装静态库(例如
/ usr / lib)你需要-L
参数来为链接器提供一个路径
你刚刚建立的静态库。
如果您只是尝试以上操作,您会发现其他链接器错误 库。静态链接时,您需要手动指定链接器 标志着快板的依赖。说实话,我不记得为什么会这样,但是 我只知道我必须这样做。
要确定这些依赖关系,请尝试使用共享构建程序一次 库:
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。
答案 1 :(得分:0)
对于任何图书馆来说,Allegro的答案都是一样的。它没有做任何特别的事情。上一张海报的答案涉及实施细节,所以我会从10,000英尺的角度来看它:
任何图书馆都有三个选项。
静态编译库。
动态编译库"并随您的程序发送Allegro库文件。 (* .DLL for Windows,* .SO"共享对象" Linux文件。)文件与您正在执行的二进制文件位于同一目录中。
动态编译库"与以前一样,但依赖系统目录中系统上已安装的库。 (例如,windows \ system32)
在第一种情况下,库代码将物理添加到您的程序中。
第二种情况和第三种情况完全不同,除了你用它打包的情况。您的程序已编译(但未包含Allegro库代码)并告知它将"找到"图书馆运行后。在启动时,运行时链接程序(Linux中的LD,运行 man ld 以获取更多信息)获取代码所需的符号列表(外部函数和全局变量),检查是否存在合适的匹配启动目录中的库,如果没有,则检查其他系统目录。
第二种情况是将所需文件与您的程序放在一起。
第三种情况依赖于已经安装的所需文件,或者使用外部"运行时分发"微软经常做的安装程序。 (DirectX运行时,Visual C ++运行时等)
因此,既然您要针对Linux,那么您可以使用第一种或第二种情况。将您特定版本的Allegro编译到您的代码中,或者使用您的代码发送您想要的版本。第二种情况的优点是,您可以在以后更改DLL / SO文件而无需编译(对于补丁/错误修复),如果您有多个可执行文件,则只需要一个一套图书馆代码。
应该注意的是,并非所有库都允许您(因为他们的许可证)在您的程序中包含二进制文件。这就是为什么您经常会看到" Microsoft Redistributables。"但是,Allegro的执照并不关心。