我有一个带有一些自制函数的共享库,我将这些函数编译到我的其他程序中,但我必须将end程序与用于编译静态库的所有库连接起来。下面是一个示例:
我在库中有函数foo,它需要来自另一个库libbar.so的函数。
在我使用函数foo的主程序中,我必须使用-lbar标志编译它。是否有一种方法可以静态地编译我的库,以便它包含来自其他库的所有所需的代码,并且我可以编译我的结束程序而不需要-lbar标志?
发布于 2010-05-11 15:47:27
共享对象(.so)不是库,而是对象。您不能提取其中的一部分并将其插入其他库中。
如果构建一个引用其他对象的共享对象--但在运行时需要另一个对象,那么您可以做什么。链接libfoo时只需添加-lbar即可。
如果您能够构建libbar,那么显然可以创建一个库,它是libfoo和libbar的组合。IIRC,您还可以让链接器构建一个库,它是libfoo和libbar所需的一部分,方法是将.a与.o链接到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发布于 2010-05-11 15:46:44
步骤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发布于 2010-05-11 16:11:33
通过使用利布工具,您可以使这类事情正常工作,请参阅库间依赖关系的libtool手册,以获得如何工作的示例。
https://stackoverflow.com/questions/2812079
复制相似问题