如何将静态库链接到gcc的动态库中
在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
。我究竟做错了什么?
静态库在链接时有特殊的规则。如果对象提供未解析的符号,则静态库中的对象只会添加到二进制文件中。
在Linux上,你可以改变这种行为与--whole-archive
链接器选项:
g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive
对于遇到这个问题像我一样(没有正确理解答案)每一个:这里是一个简短的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步应该说“mylib.o”而不是“msat.o”? – mwag 2016-05-25 16:39:47
我还没有测试过它,但基本的想法很可能。从技术上讲,--whole-archive是一个链接器选项(如果你将它作为“gcc --whole-archive”传递,gcc将不会理解它)。相反,它应该移过“-Wl”,例如:gcc -shared -Wl, - whole-archive,-soname,libmylib.so ...我会编辑答案,但我无法测试它是否存在作品。在当前的表单中,它会导致gcc错误(“无法识别的命令行选项”--whole-archive'“)。 – 2017-07-27 22:56:09
另外-Wl, - 整个档案...-Wl, - no-whole-archive块应该位于静态库(mylib.a)的周围。就像在接受的答案中一样。 – 2017-07-27 23:05:03
所以我有一些古怪的依赖在静态库中。它引用了包含在动态库中的函数。如何告诉gcc在动态库中找到未定义的引用? 谢谢 – bob 2010-04-16 00:26:05
@bob - 静态库引用动态库中的符号应该没有问题(一旦链接静态库,就好像您直接在命令行中引用.o一样)。我怀疑还有其他问题,并建议发布一个新问题。 – 2010-04-16 04:15:45
这是我的解决方案,但在OSX上,我不得不使用'-all_load'作为'--whole-archive'的等价物,正如有人在IRC上建议我的。我希望它可以帮助别人! – vmonteco 2017-06-11 14:16:07