代码之家  ›  专栏  ›  技术社区  ›  Nils

当在Linux或OSX上用gcc链接一个程序时,我怎样才能知道在使用-l时如何调用它

  •  1
  • Nils  · 技术社区  · 14 年前

    包含lib的文件名和-l中使用的名称并不总是匹配的。那我怎么知道链接时使用的名称呢?通常我在谷歌上搜索,但我想应该在系统的某个地方。。

    3 回复  |  直到 14 年前
        1
  •  2
  •   DarkDust    14 年前

    在链接期间,链接器会搜索它知道的所有库路径,并查找依赖于arch的库名称,在Linux上,在Mac“libfoo.dylib”上“-l foo”会搜索“libfoo.so”。现在,如果您查看/usr/lib中的示例,您会注意到有许多符号链接。例如,如果您有libfoo.so.1.2.3,那么还应该有符号链接libfoo.so.1.2->libfoo.so.1.2.3,libfoo.so.1->libfoo.so.1.2和libfoo.so->libfoo.so.1。这背后的想法是支持各种版本。因此,如果您需要知道使用了哪个文件,我建议您这样做:

    将“-v”添加到LDFLAGS或直接添加到gcc调用中。这将导致gcc输出有噪声,有趣的是调用“collect2”。它有各种各样的论点-我。。。这些是链接器搜索库的目录。你也会看到-我(小写(ell)。您需要查看-L中给出的库的-L目录并遵循它们的符号链接。

    如果您需要知道在运行时使用哪个库:那就容易多了。快跑 ldd some_program ,它将告诉您使用了哪些库。它实际上调用程序以便动态链接器启动,但传递一个环境变量,使链接器打印出它已加载的内容,并在启动程序之前退出程序。在Mac上,使用 otool -L some_program .

    cat /proc/pid_of_program/maps . 给你记忆地图。有趣的部分是右边的列,它列出了加载的库(因为它们被映射到进程中)。我不知道在Mac电脑上有什么等价物。

        2
  •  1
  •   gonzo_taylor    14 年前

    查看此处发生的情况的最佳方法是检查gcc(编译器和链接器)正在操作的文件:

    strace-f-e trace=open-o strace\u输出(您的\u gcc\u命令)

    '-f'需要跟随子进程,因为gcc就是这样工作的。我发现这个方法非常有用,因为我可以准确地找出链接器连接到我的可执行文件中的库。我只希望gcc-v这么冗长。

        3
  •  0
  •   Troubadour    14 年前

    man gcc 提示获取gcc的手册页。它详细说明了-l选项的作用。如果gcc使用ld作为链接器,那么就这样做 man ld 更多信息。例如,在我的Linux系统上,后者说

    -美国规范
    --库=名称规范

    添加存档或对象文件 要链接的文件。此选项可能是 在库路径中搜索文件 称为文件名,否则会 在库路径中搜索文件

    在支持共享的系统上 libnamespec.a以外的文件。 特别是精灵和苏诺斯 系统,ld将搜索一个目录 libnamespec.a.公司(按照惯例 “.so”扩展名表示共享 请注意,此行为 总是指定一个名为 文件名。

    已授予复制、分发和/或修改此文档的权限 根据合同条款 GNU Free Documentation License ,版本1.3或 自由软件基金会发布的任何更新版本;没有 不变的部分,没有封面文本,也没有封底 短信。

    还要注意,在OSX上,如果设置环境变量 RC_TRACE_ARCHIVES RC_TRACE_DYLIBS