我有一个带有一些自制函数的共享库,我将其编译到我的其他程序中,但是我必须将结束程序与我用来编译静态库的所有库相关联.这是一个例子:
我在库中有函数foo,它需要来自另一个库libbar.so的函数.
在我使用函数foo的主程序中,我必须用-lbar标志编译它.有没有办法可以静态编译我的库,所以它包含了其他库中的所有必需代码,我可以编译我的结束程序而不需要-lbar标志?
解决方法
共享对象(.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