首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态编译共享库

静态编译共享库
EN

Stack Overflow用户
提问于 2010-05-11 15:39:55
回答 4查看 4.7K关注 0票数 8

我有一个带有一些自制函数的共享库,我将这些函数编译到我的其他程序中,但我必须将end程序与用于编译静态库的所有库连接起来。下面是一个示例:

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

在我使用函数foo的主程序中,我必须使用-lbar标志编译它。是否有一种方法可以静态地编译我的库,以便它包含来自其他库的所有所需的代码,并且我可以编译我的结束程序而不需要-lbar标志?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-11 15:47:27

共享对象(.so)不是库,而是对象。您不能提取其中的一部分并将其插入其他库中。

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

如果您能够构建libbar,那么显然可以创建一个库,它是libfoo和libbar的组合。IIRC,您还可以让链接器构建一个库,它是libfoo和libbar所需的一部分,方法是将.a与.o链接到libbar中。示例:

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2010-05-11 15:46:44

步骤1(创建对象文件):

代码语言:javascript
复制
gcc -c your.c -o your.o

步骤2(创建静态库):

代码语言:javascript
复制
ar rcs libyour.a your.o

步骤3(链接到静态库):

代码语言:javascript
复制
gcc -static main.c -L. -lyour -o statically_linked
票数 4
EN

Stack Overflow用户

发布于 2010-05-11 16:11:33

通过使用利布工具,您可以使这类事情正常工作,请参阅库间依赖关系的libtool手册,以获得如何工作的示例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2812079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档