在我的编译器课程中,我将跟随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
先谢谢你
1条答案
按热度按时间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
传递给编译器。