【发布时间】:2019-05-04 11:49:22
【问题描述】:
我试图了解 C 中的静态库和共享对象。我试图了解一种类型的库是否可以依赖于其他类型。
考虑一个场景:
libA.so 有一个函数 foo_A_dyn():
libA.so ---> foo_A_dyn()
foo_A_dyn() 使用函数 foo_B_static() 定义在 libB.a 中,这是一个静态库。
libB.a ---> foo_B_static()
我通过以下方式构建了我的库:
gcc -c foo_B.c -o foo_B.o
ar -cvq libB.a foo_B.o
gcc -fPIC -c foo_A.c -o foo_A.o
gcc -shared libA.so foo_A.o -I.
gcc main.c -lA -lB -L. -I. -o EXE
注意:main.c 调用 foo_A_dyn() 而不是直接调用 foo_B_static()。
现在,当我尝试构建可执行 EXE 时,我收到错误“未定义对 foo_B_static 的引用”。
我认为这个错误似乎是真实的,但我无法解读其背后的基本原理并将其付诸实践。
有人可以帮忙吗?
【问题讨论】:
-
我们能否推断出
main.c包含对foo_A_dyn()的引用,但不包含libB.a中包含foo_B_static()的.o文件中的任何符号?如果您在main.c中的代码明确引用foo_B_static(),就没有问题。如果是我,我会将-L.选项放在使用它的-lA和-lB选项之前,但我不确定在这种情况下它是否重要(不过我认为它通常是有的——但是我愿意证明我在特定系统上的错误)。 -
我的印象是共享对象可以依赖其他共享对象,但不能涉及静态归档(所以共享对象不能依赖静态归档,静态归档不能依赖共享对象,并且一个静态存档不能依赖另一个)——都是在“自动链接或加载依赖的文件”的意义上。不过,我没有手册页可以引用。链接器是否有可能使用与您预期不同的
libB.so或libB.a? -
@JonathanLeffler 我已根据您的 cmets 编辑了我的问题。我将尝试不同的库依赖组合,并很快更新我的观察结果。
标签: c gcc shared-libraries