如何在 linux 可执行文件中使用静态库
Posted
技术标签:
【中文标题】如何在 linux 可执行文件中使用静态库【英文标题】:How to use static library in linux executable 【发布时间】:2018-10-03 15:50:35 【问题描述】:我有一个在 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
【问题讨论】:
我不相信你可以没有来源。共享库被编译为与位置无关的寻址-fPIC
,所以如果没有代码,我认为你不走运。除非我误会你了。这是你的代码吗?
@jiveturkey 不,这不是我的代码。我有源代码文件,但我只需要将一些库设为静态而不是动态。我已经提到了我想转换为静态的库,并且我已经制作了我需要更改的文件。
编译后需要使用ar
创建库。 ***.com/questions/5947067/…
@jiveturkey 我已经在 libevent 的开发包中有 .a 文件,我只需要将其设为静态即可。
【参考方案1】:
没有将共享库转换为静态库的生成文件魔法。 您需要在系统上安装库的静态版本,并且 然后,在您的 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-dev
或libevent-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
【讨论】:
感谢您的帮助。你是对的,我不需要 systemd lib 作为静态的。我尝试按照您的建议更改我的 make 文件,但是当我通过 make -f Makefile 编译时出现以下错误:/usr/bin/ld: cannnot find: No such file or directory。 Collect2 : 错误: ld 返回 1 个存在状态。 @RookieDev/usr/bin/ld: cannnot find:
不是完整的错误消息。您遗漏了它无法找到的库。
gcc -o aftpd aftpd.o cmd_parse.o fs_malloc.o ftpcmd.o ftpdata.o string.o fs_vector.o ./linux/loglinux.o ./linux/systemd.o -Wl, -Bstatic -levent_core -levent_extra -levent -levent_pthreads -Wl,-Bdynamic -lsystemd /usr/bin/ld:找不到:没有这样的文件或目录 /usr/bin/ld:找不到:没有这样的文件或目录 collect2:错误: ld 返回 1 退出状态 Makefile:15: recipe for target 'aftpd' failed make: *** [aftpd] Error 1 @Mike Kinghan 这是我的完整错误消息
@RookieDev -Wl, -Bstatic
是错误的。 -Wl,-Bstatic
是对的。中间没有空间。这就是cannot find : No such file or directory
的原因。与-Wl, -Bdynamic
相同。以上是关于如何在 linux 可执行文件中使用静态库的主要内容,如果未能解决你的问题,请参考以下文章
Makefile常用万能模板(包括静态链接库动态链接库可执行文件)