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

时间:2018-10-03 15:50:35

标签: c++ c linux makefile

我有一个在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)

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

这是我的make文件库:

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

1 个答案:

答案 0 :(得分:3)

没有makefile魔术可以将共享库变成静态库。 您需要在系统上安装库的静态版本,然后 然后在您的makefile中,指定库的静态版本为 被链接。

您似乎需要安装的静态库是:

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

已经安装了这些库,您将修改makefile以链接它们 静态更改:

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

收件人:

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

但是,您不能完全做到这一点,因为没有libsystemd的静态版本。 Here's why

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

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

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

这里是the documentation of the linker options