前段时间我不得不弄清楚这一点,以下是基于对我有用的步骤的指南。很可能有一种“更好”的方式来静态链接到 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
然后在生成的二进制文件 (main) 上运行 ldd。您应该会看到如下内容:
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。