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

Linux Gcc链接器自动查找所需的额外库,linux,gcc,linker,Linux,Gcc,Linker,我正在两台不同的机器上开发和测试一些代码:我自己的*buntu笔记本电脑和其他人配置的远程linux机器 我的代码使用一个库,比如说libfoo,它反过来又依赖于libbase。 我希望在这两台机器上都保留一个makefile,但我发现在使用GCC构建项目时,情况有所不同: 在我的笔记本电脑上,我需要为要链接的代码指定-lfoo-lbase 正确地 在远程机器上,我只需要-lfoo标志和链接器 以某种方式自动拾取基础库。 有人知道发生了什么吗?在从源代码构建libfoo时,是否有可能传递任何标志

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

我的代码使用一个库,比如说libfoo,它反过来又依赖于libbase。 我希望在这两台机器上都保留一个makefile,但我发现在使用GCC构建项目时,情况有所不同:

在我的笔记本电脑上,我需要为要链接的代码指定-lfoo-lbase 正确地 在远程机器上,我只需要-lfoo标志和链接器 以某种方式自动拾取基础库。 有人知道发生了什么吗?在从源代码构建libfoo时,是否有可能传递任何标志,使这种自动依赖性检测成为可能

PS:我知道我可以指定make文件中的每个库,但是将标志列表保持在最小看起来很有趣,我想知道引擎盖下发生了什么。

是的。-lfoo和-lbase都引用了一些共享库libfoo.so和libbase.so,可能有一些版本号

在远程机器上,libfoo.so被构建并链接到libbase.so,可能来自一些类似foo1.c和foo2.c的文件

当然,可能有一些Makefile确实通过make在命令之上运行

在您自己的笔记本电脑上,您或您的发行商没有在libfoo.so中链接-lbase

读一篇长文章,读一读

可以将一个共享的低级库链接到另一个高级共享库中,而静态库libfoo.a则不可能

您可以在libfoo.so和libbase.so库的绝对路径上使用ldd来了解它们是如何链接的。

这有点奇怪。。。基本库实际上是epetra库,这是foo库上ldd结果中的相关行:libepetra.so.11=>/usr/local/lib/libepetra.so.11 0x00007fbce0dfc000,据我所知,这看起来像是定期链接的。
 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