【问题标题】:Gcc linker automagically finds needed extra librariesGcc 链接器自动找到所需的额外库
【发布时间】:2013-12-18 13:38:13
【问题描述】:

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

我的代码使用了一个库,比如说 libfoo,它又依赖于 libbase。 我想在两台机器上保留一个 makefile,但我发现当我构建我的项目(使用 GCC)时事情会有所不同:

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

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

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

【问题讨论】:

    标签: linux gcc linker


    【解决方案1】:

    是的。 -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 运行了以上命令)

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

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

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

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

    【讨论】:

    • 这有点奇怪...base库实际上是epetra库,这是lddfoo库上的结果中的相关行:@ 987654344@,据我所知,这看起来像是定期链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2023-03-11
    相关资源
    最近更新 更多