Gcc链接器自动查找所需的额外库

时间:2013-12-18 13:38:14

标签: linux gcc linker

我正在两台不同的机器上开发和测试一些代码:我自己的* buntu笔记本电脑和其他人配置的远程linux机器。

我的代码使用了一个库,比如libfoo,反过来又取决于libbase。 我想在两台机器上保留一个makefile,但是当我构建我的项目(使用GCC)时,我发现事情的工作方式不同:

  • 在我的笔记本电脑上,我需要为要链接的代码指定-lfoo -lbase 正确。
  • 在远程计算机上,我只需要-lfoo标志和链接器 以某种方式自动获取基础库。

任何人都知道发生了什么事?从源代码构建libfoo时是否有可能已经传递的标志使得这种自动“依赖性检测”成为可能?

PS:我知道我可以只指定make文件中的每个库,但是将标志列表保持在最低限度看起来很有趣,而且我想知道幕后发生了什么。

1 个答案:

答案 0 :(得分:0)

是。 -lfoo-lbase都引用了一些共享库libfoo.solibbase.so(可能带有一些版本号)。

在远程计算机上,libfoo.so已构建并链接到libbase.so,可能来自某些foo1.cfoo2.c

 gcc -Wall -O -fPIC foo1.c -o foo1.pic.o
 gcc -Wall -O -fPIC foo2.c -o foo2.pic.o
 gcc -shared -O foo1.pic.o foo2.pic.o -lbase -o libfoo.so

(当然,可能有些Makefile确实通过make以上的命令运行了

在您自己的笔记本电脑上,您(或您的发行商)未将-lbase内的libfoo.so链接起来

阅读Drepper's how to write shared library(长)论文(以及program library howto

可以在另一个(更高级别)共享库中链接共享(低级)库(这对于静态库libfoo.a是不可能的)。

您可以使用ldd(库的绝对路径)libfoo.solibbase.so来了解它们的链接方式。