我正在两台不同的机器上开发和测试一些代码:我自己的* buntu笔记本电脑和其他人配置的远程linux机器。
我的代码使用了一个库,比如libfoo,反过来又取决于libbase。 我想在两台机器上保留一个makefile,但是当我构建我的项目(使用GCC)时,我发现事情的工作方式不同:
任何人都知道发生了什么事?从源代码构建libfoo时是否有可能已经传递的标志使得这种自动“依赖性检测”成为可能?
PS:我知道我可以只指定make文件中的每个库,但是将标志列表保持在最低限度看起来很有趣,而且我想知道幕后发生了什么。
答案 0 :(得分:0)
是。 -lfoo
和-lbase
都引用了一些共享库libfoo.so
和libbase.so
(可能带有一些版本号)。
在远程计算机上,libfoo.so
已构建并链接到libbase.so
,可能来自某些foo1.c
和foo2.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.so
和libbase.so
来了解它们的链接方式。