静态编译共享库

Sim*_*ker 8 c c++ linker static shared-libraries

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

foo在库中有功能,需要来自另一个库的功能libbar.so.

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

APr*_*mer 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
Run Code Online (Sandbox Code Playgroud)