如何在 linux 可执行文件中使用静态库

How to use static library in linux executable

本文关键字:静态 可执行文件 linux      更新时间:2023-10-16

我有一个在Linux上编译的项目。当我对可执行文件运行ldd命令时,我得到的是:

libevent_core-2.1.so.6 => /usr/lib/x86_64-linux-gnu/libevent_core-2.1.so.6 (0x00007fca87a5e000)
libevent_pthreads-2.1.so.6 => /usr/lib/x86_64-linux-gnu/libevent_pthreads-2.1.so.6 (0x00007fca8785b000)

现在,我想让这些库编译为静态库。我该怎么做?

这是我的制作文件库:

LIBS    = -levent_core -levent_extra -levent -levent_pthreads -lsystemd

没有将共享库转换为静态库的生成文件魔法。 您需要在系统上安装库的静态版本,并且 然后,在生成文件中,指定库的静态版本为 被链接。

看起来您需要安装的静态库是:

libevent_core.a
libevent_extra.a
libevent.a
libevent_pthreads.a
libsystemd.a

安装这些库后,您将修改生成文件以链接它们 通过更改静态:

LIBS    = -levent_core -levent_extra -levent -levent_pthreads -lsystemd

自:

LIBS    = -Wl,-Bstatic -levent_core -levent_extra -levent -levent_pthreads -lsystemd -Wl,-Bdynamic

但是,您无法完全做到这一点,因为没有libsystemd的静态版本 .原因如下。

列表中有其他库的静态版本。您可以安装它们 通过安装libevent开发包(可能是包libevent-devlibevent-devel, 取决于您的 Linux 发行版(。然后,您可以将这些静态链接为:

LIBS    = -Wl,-Bstatic -levent_core -levent_extra -levent -levent_pthreads -Wl,-Bdynamic -lsystemd

请注意-Wl,-Bstatic-Wl,-Bdynamic中没有空格。形式的 GCC 选项-Wl,...意味着 GCC 应将选项...传递给其对链接器的调用。

下面是链接器选项的文档