当前位置: 首页 > 面试题库 >

为什么有时必须使用GCC在库链接器标志的末尾添加标记?

赫连冠玉
2023-03-14
问题内容

我正在编写一个使用librt的小型C程序。如果将链接标志放在开头而不是结尾,程序将无法编译,我感到很惊讶:

此刻,我要编译程序:

gcc -o prog prog.c -lrt -std=gnu99

如果执行以下操作,它将无法在librt中找到函数:

gcc -std=gnu99 -lrt -o prog prog.c

但是,这可以与其他库一起使用。我在尝试使用简单的Makefile时发现了问题。进行实际编译的prog.c而不先喜欢(使用-c标志),然后进行链接。

这是Makefile:

CC = gcc

CFLAGS = -std=gnu99

LIBS= -lrt

LDFLAGS := -lrt


prog: prog.o

        $(CC) -o prog prog.c -lrt -std=gnu99

键入make时,我得到的输出将是:

gcc -std=gnu99   -c -o prog.o prog.c
gcc -lrt  prog.o   -o prog
prog.o: In function `main':
prog.c:(.text+0xe6): undefined reference to `clock_gettime'
prog.c:(.text+0x2fc): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make: *** [buff] Error 1

我现在已经制作了一个Makefile,它将链接放在gcc行的末尾,但是我感到困惑的是,如果链接标志位于开始位置,为什么它不起作用。

如果有人可以向我解释,我将不胜感激。谢谢。


问题答案:

链接器在处理每个模块(是库还是目标html" target="_blank">文件)时,会尝试解析每个未定义的符号,同时可能将其添加到未定义的符号列表中。当到达模块列表的末尾时,它要么解决了所有未定义的符号并成功,要么报告了未定义的符号。

就您而言,当它处理librt时,它没有未定义的符号。处理过程导致clock_gettime是未定义的符号。gcc不会返回并在librt中查找未定义的符号。

因此,您应该始终先获取代码,再获取库,再获取平台提供的库。

希望这可以帮助。



 类似资料:
  • 问题内容: 使用输出 当ajax调用完成时,此代码将触发。任何想法为什么这样做? 假设数据变量是有效的JSON对象。 问题答案: 尽管jQuery提供了抽象,但是您正在操作DOM中的 元素 ,而不是HTML源代码中的标签。 是的简写。 您需要将表行附加到表,而不是容器(同样,单元格也需要添加到行)。

  • 问题内容: 在我看到的所有支持可选参数的编程语言中,都有一个模仿,即可选参数必须出现在声明的末尾。可选项目后不得包含必需的参数。是什么原因呢?我想这可能是编译器/解释器的要求。 问题答案: 好吧,如果它们在最前面,您将如何检测何时停止供应它们?唯一的方法是 在 可选参数 之后 变量类型是否不同。有点不可思议的要求,因此您只需将它们强制设置为最后是有意义的(省去了用于检测“最终”可选参数的复杂规则的

  • 我有一个<代码> 并且当用户将他们的文本粘贴到textarea字段时。 洛雷姆·伊普苏姆·多洛尔·西特(Lorem ipsum dolor sit amet), 连续的发展精英们, 我们的目标是实现平等。 单击按钮时,它将如下所示。 Lorem ipsum dolor sit amet,<代码> 帮帮我伙计们。

  • 问题内容: 我知道这个问题被问过很多次,但是我没有找到答案。那么,为什么建议在body标签的末尾添加脚本以更好地渲染呢? 从Udacity课程和CSSOM准备就绪后开始渲染。JS是HTML解析阻止程序,并且CSSOM准备好后,任何脚本都会启动。 因此,如果我们得到: CRP为: 如果脚本在头: CRP将相同: 这个问题仅与“同步”脚本有关(没有async / defer属性)。 问题答案: 从历史

  • 以下内容会生成符合CADES的消息签名吗? CMS_sign()的API文档似乎表明,为了将SHA256用于消息摘要,我需要使用标志“CMS_PARTIAL”。此外,OpenSSL的CAdES补丁似乎暗示了CMS_PARTILL并手动调用“CMS_ADD1_SIGNING_CERT_V2()”,后面跟着“CMS_FINAL()”。但是我希望在CMS_sign()中添加CMS_CADES标志就足够了

  • 我发现谷歌标签管理器(GTM)周围的谷歌留档在帮助我弄清楚哪些比特去哪里方面很糟糕。 据我所知,GTM要求你把一个