可以用静态链接使用库构建共享库吗?

问题描述 投票:0回答:3
我可以使用带有静态链接的 gcc 构建可执行文件:

gcc -static xxx.c -o xxx

这样我就可以在没有任何外部依赖库的情况下运行xxx。

但是如果我想构建没有外部依赖库的共享库怎么办?我的意思是我想要 共享库静态链接其外部引用。

c linux gcc
3个回答
15
投票
这会起作用:

# Generate position independent code (PIC) gcc -fPIC -c -o xxx.o xxx.c # Build a shared object and link with static libraries ld -shared -static -o xxx.so xxx.o # Same thing but with static libc ld -shared -static -o xxx.so xxx.o -lc

澄清:如果将 -static 标志赋予 gcc,则会传递给链接器 (ld) 并告诉它使用库的静态版本 (.a)(用 -l 标志指定),而不是动态版本(.so)。

另一件事:在我的系统(Debian)上,最后一个示例给出了

libc.a ... 重新编译时出现 -fPIC 错误。很确定这意味着我系统上的 libc.a 不是使用 -fPIC 编译的。然而,apt-cache search libc pic确实给出了一些结果。

另请参阅:

程序库 HOWTOSO:组合 .so 库ld(1)gcc(1)


3
投票
您可以使用 Rpath 进行一些巧妙的黑客操作,以便

ELF 可执行文件或 .so 将首先在与其自身相同的目录中查找其依赖的 .so 文件:

  • 制作一个简短的脚本 echo-rpath,其中包含

    echo '-Wl,--rpath=$ORIGIN'

  • 将其添加到您的构建命令行中 gcc -o file -lwhatever

    `echo-rpath `

     对象

(echo 机制可以防止 Make 或 shell 吃掉 $ 符号并确保它被传递到 ld 中。)


1
投票
如果您对共享库的可移植性有任何计划,请使用

libtool(1)

。它将为您处理编译器标志的大部分细节,并使您的生活变得更加轻松。如果您不使用 libtool
,但后来决定将程序移植到 OS X 或 Windows,那么无论如何您最终都会重新发明它。

© www.soinside.com 2019 - 2024. All rights reserved.