可以build立一个静态链接使用库的共享库?

我可以build立一个与静态链接与gcc的可执行文件:

gcc -static xxx.c -o xxx

所以我可以运行xxx而不需要任何外部依赖库。

但是如果我想构build共享库而不依赖于外部库? 我的意思是我希望共享库静态链接其外部参考。

这将工作:

# 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 

澄清:如果给gcc,-static标志被传递给链接器(ld),并告诉它与库的静态版本(.a)一起工作(用-l标志指定),而不是动态版本(.so)。

另一件事:在我的系统(Debian)最后一个例子给出了一个libc.a …重新编译与-fPIC错误。 很确定,这意味着我的系统上的libc.a没有用-fPIC编译。 一个apt-cache搜索libc图片确实给出了一些结果。

另请参见: 程序库HOWTO , SO:结合.so库 , ld(1) , gcc(1)

你可以用Rpath做一些整洁的hackery,这样一个ELF可执行文件或者.so将首先在与它自己相同的目录中查找它相关的.so文件:

  • 做一个简短的脚本echo-r​​path组成

    echo'-Wl, – rpath = $ ORIGIN'

  • 添加到你的生成命令行为gcc -o file -lwhatever`echo `echo-rpath ` rpath`对象

(echo机制阻止Make或shell使用$符号并确保它被传入ld。)

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