我试图了解C中的静态库和共享库。我试图了解一种类型的库是否可以依赖于另一种类型。
考虑一个场景:
libA.so具有函数foo_A_dyn():
libA.so ---> foo_A_dyn()
foo_A_dyn()使用在静态库libB.a中定义的函数foo_B_static()。
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的未定义引用”。
我认为该错误似乎是真实的,但我无法解释其背后的原因并将其说出来。
有人可以帮忙吗?
答案 0 :(得分:2)
-图书馆
-l库
...
在命令中写入此选项的位置会有所不同。链接器按照指定的顺序搜索和处理库和目标文件。因此,“ foo.o -lz bar.o”在文件foo.o之后但在bar.o之前搜索库“ z”。如果bar.o引用了“ z”中的函数,则可能不会加载这些函数。
尝试:
gcc main.c -lB -lA -L. -I. -o EXE
答案 1 :(得分:0)
链接器正在执行以下操作。当我们链接可执行文件(上面的“ EXE”)时,它具有一些未解析的符号(功能和其他内容)。它将按顺序查看后续的库列表,尝试解析未解析的符号。一路上,它发现某些符号是由libB.so提供的,因此它指出该库现在已解析它们。在遍历libB.so时,它会找到一些未解析的符号,并尝试通过查找后面的库来解析它们。
订购以下库时:
gcc main.c -lA -lB -L. -I. -o EXE
链接器无法在libA中查找libB中使用的符号的定义。原因可能是没有向后引用。
我也发现:
共享对象可以依赖于静态存档
静态存档可以依赖共享对象,并且
一个静态档案可以依赖另一个静态档案
请让我知道我是否在某个地方犯了错误。