【问题标题】:GCC: Inconsistent "undefined function" warnings?GCC:不一致的“未定义函数”警告?
【发布时间】:2020-07-09 02:49:19
【问题描述】:

最近我一直在四处寻找并试图弄清楚 C 编译器是如何工作的。

我注意到不同的计算机似乎对以下操作表现出不同的行为:

// a.c

// #include"oui.h"
int main() {
  oui();
}
// oui.h

void oui();

gcc -c a.c

在一台计算机上,我被警告 a.c 中的函数 oui 未定义。这对我来说很有意义,取消注释包含解决了问题。

然而,在另一台计算机上,即使将包含注释掉,编译器也会毫无怨言地生成对象a.o。这对我来说有意义,因为没有头文件,oui 不是 undefined 吗?

什么是正常行为?我的其中一台计算机上的某些设置是否有问题?

如果您不想,请不要理会以下问题,它们只是突然出现在我的脑海中,如果需要,我会再做一个线程:)。

附带问题:-c 标志生成目标文件但不链接,那么之后是否有一个特殊的“链接”标志将目标文件放在一起,还是只是 gcc?为什么不在一开始就将所有内容 gcc 一起使用?

附带问题 #2:如果我选择 gcc filea fileb filec,那么 filea 作为第一个参数本身就很特别吗?还是 gcc 的顺序无关紧要,因为编译器会自行找到具有 main 的文件?

【问题讨论】:

  • 确切的错误消息或警告是什么? ouiundefined 的错误会很奇怪。 未声明隐式声明的错误是我所期望的。
  • 定义声明之间的区别在这里很关键。您可能想阅读stackoverflow.com/questions/1410563/…

标签: gcc


【解决方案1】:

这可能是两台计算机之间的版本差异。

什么是正常行为? 如果您使用未声明的函数,编译器应发出警告。

我的其中一台计算机上的某些设置是否有问题? 我不这么认为,你有一个新的 gcc 和一个旧的。

附加问题 #1: 如果你在没有-c 的情况下使用 gcc,它将尝试调用链接器。在此示例中,链接器将失败,因为 oui 未定义。 -c 常用于 Makefiles/用于更大的项目,因为您可以更快地重新编译,因为编译器不必重新编译每个源文件。

附带问题 #2: 源文件的顺序无关紧要,因为链接器会自行找到main

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2014-07-21
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多