Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当在Linux或OSX上将程序与gcc链接时,我如何才能知道它是如何';当使用-l时调用_Linux_Macos_Linker - Fatal编程技术网

当在Linux或OSX上将程序与gcc链接时,我如何才能知道它是如何';当使用-l时调用

当在Linux或OSX上将程序与gcc链接时,我如何才能知道它是如何';当使用-l时调用,linux,macos,linker,Linux,Macos,Linker,包含库的文件名与-l中使用的名称并不总是匹配。那么,我怎样才能知道链接时使用的名称呢?通常我会在谷歌上搜索,但我认为它应该在系统中的某个地方。只要在提示下键入mangcc,就可以获得gcc的手册页面。它详细说明了-l选项的作用。如果gcc使用ld作为链接器,那么只需执行manld即可获得更多信息。例如,在我的Linux系统上,后者说 -lnamespec --library=namespec 添加归档文件或对象文件 由namespec指定到 要链接的文件。此选项可能是 使用任意次数。If nam

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

只要在提示下键入
mangcc
,就可以获得gcc的手册页面。它详细说明了-l选项的作用。如果gcc使用ld作为链接器,那么只需执行
manld
即可获得更多信息。例如,在我的Linux系统上,后者说

-lnamespec
--library=namespec

添加归档文件或对象文件 由namespec指定到 要链接的文件。此选项可能是 使用任意次数。If namespec 格式为:filename,ld will 在库路径中搜索文件 称为文件名,否则它将 在库路径中搜索文件 称为libnamespec.a

关于支持共享的系统 图书馆,劳工处也可以搜索 libnamespec.a以外的文件。 特别是在ELF和SunOS上 系统,ld将搜索目录 对于名为libnamespec.so的库 在搜索一个被调用的 libnamespec.a。(按惯例,a) “.so”扩展名表示共享 请注意,此行为 不适用于:filename,其中 始终指定一个名为 文件名

版权所有(c)1991、92、93、94、95、96、97、98、99、2000、2001、2002、, 2003, 2004, 2005、2006, 2007, 2008、2009免费软件基金会 授予复制、分发和/或修改本文件的权限 根据第1.3版或 自由软件基金会发布的任何后续版本;没有 不变部分,无封面文本,无封底 文本


还要注意,在OSX上,如果设置环境变量
RC_TRACE_ARCHIVES
RC_TRACE_DYLIBS
,则ld将打印大量有用的调试信息。如果您在构建时选择了错误的库,这会很有帮助。

我的答案有点混乱,很抱歉。我很确定有更好的解决方案,但这应该会有所帮助

在链接期间,AFAIK链接器搜索它知道的所有库路径,并查找依赖于arch的库名称,在Linux上“-l foo”将在Mac“libfoo.dylib”上搜索“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”。它有各种各样的论点——L。。。这些是链接器搜索库的目录。你也会看到-l。。。(小写)。您需要查看-L中给出的库的-L目录,并遵循它们的符号链接

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


对于正在运行的程序,您需要找出程序的PID。然后执行程序/映射的cat/proc/pid。这将为您提供内存映射。有趣的部分是右侧列,其中列出了加载的库(因为它们被映射到流程中)。我不知道Mac上的等价物。

了解这里发生了什么的最好方法是准确地检查gcc(编译器和链接器)正在操作哪些文件:

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


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

啊,是的,ldd和otool是我正在寻找的一些程序,但忘记了名称。谢谢你的回答。