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

时间:2010-04-15 23:47:07

标签: 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下看不到功能。我做错了什么?

2 个答案:

答案 0 :(得分:41)

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

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

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

答案 1 :(得分:16)

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

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

2。)使用

将此mylib.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编译)转换为 动态库。我不确定这对其他图书馆是否有用。