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