如何在gcc中将静态库链接到动态库中

bob*_*bob 35 gcc

在gcc(g ++)下,我编译了一个静态.a(调用它some_static_lib.a)库.我想把这个.a文件链接(这是正确的短语?)到libsomeDyn.so我正在构建的另一个动态库(称之为).虽然.so编译,我看.a不到.so使用nm命令的内容:

/ usr/bin/g ++ -fPIC -g -O2 -Wall -Werror -pipe -march = pentium3 -mtune = 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.我究竟做错了什么?

R S*_*hko 44

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

在Linux上,您可以使用--whole-archive链接器选项更改该行为:

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说是解决方案,但在OSX上我不得不使用`-all_load`作为`--whole-archive`的等价物,因为有人在IRC上建议我.我希望它可以帮助别人! (2认同)

And*_*ern 16

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

1.)创建一个仅导入mylib.h文件的mylib.c文件

2.)将此mylib.c编译为mylib.o

gcc -c -fPIC mylib.c -o msat.o
Run Code Online (Sandbox Code Playgroud)

3.)使用以下命令生成动态库:

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 
Run Code Online (Sandbox Code Playgroud)

这至少对我有用,将静态库(使用-fPIC编译)转换为动态库.我不确定这对其他图书馆是否有效.

  • 是第2步应该说"mylib.o"而不是"msat.o"? (3认同)
  • 我还没有测试过,但基本的想法可能没问题。从技术上讲,--whole-archive 是一个链接器选项(如果您将其作为“gcc --whole-archive”传递,gcc 将无法理解它)。相反,它应该移过“-Wl”,例如:gcc -shared -Wl,--whole-archive,-soname,libmylib.so ...我会编辑答案,但我无法测试它是否作品。在当前形式下,会导致gcc错误(“无法识别的命令行选项'--whole-archive'”)。 (2认同)
  • 另外 -Wl,--whole-archive ... -Wl,--no-whole-archive 块应该位于静态库 (mylib.a) 周围。就像在接受的答案中一样。 (2认同)