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

时间:2009-08-28 03:06:53

标签: c linux gcc compiler-construction

我可以使用带有静态链接的gcc构建一个可执行文件:

  

gcc -static xxx.c -o xxx

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

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

3 个答案:

答案 0 :(得分:13)

这将有效:

# 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搜索libc pic 确实给出了一些结果。

另请参阅:Program Library HOWTOSO: combining .so libsld(1)gcc(1)

答案 1 :(得分:3)

你可以用Rpath做一些巧妙的hackery,以便ELF可执行文件或.so将首先在与自身相同的目录中查找其依赖的.so文件:

  • 制作一个由

    组成的简短脚本echo-r​​path

    echo'-WI, - rpath = $ ORIGIN'

  • 将其添加到构建命令行中,作为gcc -o file -lwhatever `echo-rpath `个对象

(回声机制阻止Make或shell吃$符号并确保它传递给ld。)

答案 2 :(得分:1)

如果您对共享库的可移植性有任何计划,请使用libtool(1)。它将为您处理编译器标志的大部分细节,并将使您的生活更加轻松。如果您不使用libtool,但后来决定将程序移植到OS X或Windows,那么无论如何您最终都会重新发明它。