gcc链接两个文件在macOS中不起作用

1u4esq0p  于 2022-11-12  发布在  Mac
关注(0)|答案(1)|浏览(183)

在我的编译器课程中,我将跟随Abdulaziz Ghuloum编写的Incremental Approach to Compiler Construction以及附带的tutorial
runtime.c

#include <stdio.h>

int main(int argc, char** argv) {
    printf("%d\n", entry_point());
    return 0;
}

ctest.c

int entry_point() {
    return 7;
}

然后,作者运行以下命令:

$ gcc -Wall ctest.c runtime.c -o test
[bunch of warnings]
$ ./test
7
$

但是当我运行$ gcc -Wall ctest.c runtime.c -o test时,我得到以下错误:

runtime.c:9:20: error: implicit declaration of function 'entry_point' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    printf("%d\n", entry_point());

我希望能够像作者使用gcc那样编译和链接我的两个.c文件,但它总是给我带来这个错误。我一直在做一些research,但同样的命令($ gcc file1.c file2.c -o combined)总是出现。帮助将不胜感激。
我在MacOS Monterey 12.6上运行这个程序,并进行gcc --version显示:

Apple clang version 14.0.0 (clang-1400.0.29.102)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

先谢谢你

djmepvbi

djmepvbi1#

在macOS上,默认的编译器是clang,而不是gcc,后者只是一个指向clang的符号链接,所以要记住这一点。
Clang在runtime.c中看到了对entry_point()的调用,但并不知道它。传统的C语言对这样一个未定义的函数是假设它返回int,并且不接受参数。但是Clang默认选择了安全的方法,而不是仅仅警告它,而是将其视为一个错误,因为大多数时候这个假设是错误的,可能会导致运行时问题。
您有多种选择:

  • runtime.c中添加一个定义int entry_point(void);#include的头文件。
  • runtime.c的顶部附近添加int entry_point(void);线。
  • -Wno-error=implicit-function-declaration传递给编译器。

相关问题