2010-04-15 131 views
26

在gcc(g ++)下,我编译了一个静态的.a(称之为some_static_lib.a)库。我想将这个.a文件链接到另一个动态库(称为libsomeDyn.so),我正在构建这个文件。如何将静态库链接到gcc的动态库中

的/ usr /斌/克++ -fPIC -g -O2 -Wall -Werror -pipe -march = pentium3 -mtune:虽然.so编译,我不使用nm命令看到.so下的.a内容= prescott -MD -D_FILE_OFFSET_BITS = 64 -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -I ../../../../../../../../ -I ../../ .. /../../../../..//libraries -Wl,-rpath,/ usr/lib -o libsomeDyn.so some.o another.o some_static_lib.a -shared -Wl -x - Wl,-soname,libsomeDyn.so

我没有看到some_static_lib.a下的功能libsomeDyn.so。我究竟做错了什么?

回答

33

静态库在链接时有特殊的规则。如果对象提供未解析的符号,则静态库中的对象只会添加到二进制文件中。

在Linux上,你可以改变这种行为与--whole-archive链接器选项:

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive 
+0

所以我有一些古怪的依赖在静态库中。它引用了包含在动态库中的函数。如何告诉gcc在动态库中找到未定义的引用? 谢谢 – bob 2010-04-16 00:26:05

+0

@bob - 静态库引用动态库中的符号应该没有问题(一旦链接静态库,就好像您直接在命令行中引用.o一样)。我怀疑还有其他问题,并建议发布一个新问题。 – 2010-04-16 04:15:45

+0

这是我的解决方案,但在OSX上,我不得不使用'-all_load'作为'--whole-archive'的等价物,正如有人在IRC上建议我的。我希望它可以帮助别人! – vmonteco 2017-06-11 14:16:07

14

对于遇到这个问题像我一样(没有正确理解答案)每一个:这里是一个简短的HOWTO生成静态的(mylib.a上)一个动态库(libmylib.so):

1)创建仅导入mylib.h文件

2)编译这个MyLib中mylib.c文件.c到mylib.o用

gcc -c -fPIC mylib.c -o msat.o 

3)产生用下面的命令动态库:

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 

,至少为我工作,把静态库(含-fPIC编译)到 一个动态库。我不确定这是否适用于其他图书馆。

+2

是第2步应该说“mylib.o”而不是“msat.o”? – mwag 2016-05-25 16:39:47

+0

我还没有测试过它,但基本的想法很可能。从技术上讲,--whole-archive是一个链接器选项(如果你将它作为“gcc --whole-archive”传递,gcc将不会理解它)。相反,它应该移过“-Wl”,例如:gcc -shared -Wl, - whole-archive,-soname,libmylib.so ...我会编辑答案,但我无法测试它是否存在作品。在当前的表单中,它会导致gcc错误(“无法识别的命令行选项”--whole-archive'“)。 – 2017-07-27 22:56:09

+0

另外-Wl, - 整个档案...-Wl, - no-whole-archive块应该位于静态库(mylib.a)的周围。就像在接受的答案中一样。 – 2017-07-27 23:05:03