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

gcc中如何将静态库链接到动态库,gcc,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\u OFFSET\u BITS=64-DLINUX-D_GNU\u SOURCE-D_THREA

在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\u OFFSET\u BITS=64-DLINUX-D_GNU\u SOURCE-D_THREAD\u SAFE-I../../../../../../../../../../../../../../../../../../../../../../../../../libraries-Wl-rpath,/usr/libraries-o libsomeDyn.so some.some.o some.o some.o some.o some.o some.o some -Wl,-soname,libsomeDyn.so


我没有看到
libsomeDyn.so
下的
some\u static\u lib.a
下的函数。我做错了什么?

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

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

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

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

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

2.)使用

gcc -c -fPIC mylib.c -o mylib.o
3.)使用以下命令生成动态库:

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 
这至少对我起了作用,将静态库(使用-fPIC编译)转换为
动态库。我不确定这是否也适用于其他库。

因此我在静态库中有一些奇怪的依赖关系。它引用动态库中包含的函数。如何告诉gcc在动态库中查找未定义的引用?Thanks@bob-静态库引用动态库中的符号应该没有问题(链接静态库后,与直接引用命令行上的.o相同)。我怀疑可能还有其他问题,建议发布一个新问题。这是我的解决方案,但在OSX上,我不得不使用
-all\u load
,相当于有人在IRC上建议我使用的
-whole archive
。我希望它能帮助别人!步骤2应该说“mylib.o”而不是“msat.o”吗?我还没有测试过它,但基本思想可能还可以。从技术上讲,--wholearchive是一个链接器选项(如果您将其作为“gcc--wholearchive”传递,gcc将不会理解它)。相反,它应该移过“-Wl”,例如:gcc-shared-Wl,-whole archive,-soname,libmylib.so。。。我会编辑答案,但我没有办法测试它是否有效。在当前表单中,它将导致gcc错误(“无法识别的命令行选项'--whole archive'))。此外,-Wl,-whole archive-Wl,--静态库(mylib.a)周围不应存在整个归档块。就像在接受的答案中一样。我注意到您忘记编写生成
mylib.a
的步骤。为什么不为静态库使用不同的名称,例如
mystaticlib.a