静态编译共享库

时间:2010-05-11 15:39:56

标签: c++ c static linker shared-libraries

我有一个带有一些自制函数的共享库,我将其编译到我的其他程序中,但是我必须将结束程序与我用来编译静态库的所有库相关联。这是一个例子:

我在库中有函数foo,它需要来自另一个库libbar.so的函数。

在我使用函数foo的主程序中,我必须用-lbar标志编译它。有没有办法可以静态编译我的库,所以它包含了其他库中的所有必需代码,我可以编译我的结束程序而不需要-lbar标志?

4 个答案:

答案 0 :(得分:5)

共享对象(.so)不是库,它们是对象。您无法提取部分内容并将其插入其他库中。

如果构建引用另一个的共享对象,您可以做什么 - 但在运行时需要另一个。只需在链接libfoo时添加-lbar。

如果你能够构建libbar,你显然可以建立一个libfoo和libbar组合的库。 IIRC,你也可以通过链接.a和.o意图进入libbar,使链接器构建一个libfoo库和libbar所需的部分。例如:

gcc -fPIC -c lib1.c     # define foofn(), reference barfn1()
gcc -fPIC -c lib2a.c    # define barfn1(), reference barfn2()
gcc -fPIC -c lib2b.c    # define barfn2()
gcc -fPIC -c lib2c.c    # define barfn3()
gcc -c main.c           # reference foofn()
ar -cru libbar.a lib2*.o
gcc -shared -o libfoo.so lib1.o -L. -lbar
nm libfoo.so | grep barfn2()    # ok, not here
gcc -o prog main.o -L. -lfoo
env LD_LIBRARY_PATH=. ./prog    # works, so foofn(), barfn1() and barfn2() are found

答案 1 :(得分:4)

步骤1(创建目标文件):

gcc -c your.c -o your.o

步骤2(创建静态库):

ar rcs libyour.a your.o

步骤3(链接静态库):

gcc -static main.c -L. -lyour -o statically_linked

答案 2 :(得分:2)

您可以使用libtool来处理此类工作,请参阅libtool manual on Inter library dependencies了解其工作原理的示例

答案 3 :(得分:1)

基本上,如果你有静态库依赖的系统库的静态链接库,你可以静态链接它们的所有代码。

但是,我不确定为什么。 * NIX平台对共享库的处理是一项天才的工作,并严重削减了编译的程序大小。如果您担心由于缺少库而无法在另一台计算机上运行代码,那么您始终可以采用为Linux库编译的大多数闭源程序的路径:只需使用-Wl,--rpath -Wl,.选项将它们编译为GCC并将库与二进制文件一起分发。