我有一个问题,但我不确定它是关于 C , clang 还是 OSX 。
当我编译一个简单的 GLUT 程序时:
clang test.c -framework OpenGL -framework GLUT
我故意插入一个不存在的函数调用,如下所示:
thisFunctionIsNotDefinedAnywhere();
我收到错误,正如所料。但这就是问题 - 在链接时间之前我没有得到错误!
Undefined symbols for architecture x86_64:
"thisFunctionIsNotDefinedAnywhere" referenced from:
_main in test-e099d2.o
ld: symbol(s) not found for architecture x86_64
这是为什么?这是因为 pre-C99 有隐式声明吗?我已经编程了很长时间,从来没有碰到过这个。是因为我在GCC
和MSVC
被宠坏了(我似乎记得)在这种情况下会导致编译器错误?或者它与框架链接如何在 OSX 中工作有关,我是新手?
我感谢任何澄清!
答案 0 :(得分:1)
正如预期的那样,这会给最新版本的clang发出警告。我尝试使用Xcode 6.1附带的版本,并得到了这个编译器输出:
$ clang test.c
test.c:2:5: warning: implicit declaration of function 'thisFunctionIsNotDefinedAnywhere' is invalid in
C99 [-Wimplicit-function-declaration]
thisFunctionIsNotDefinedAnywhere();
^
1 warning generated.
Undefined symbols for architecture x86_64:
"_thisFunctionIsNotDefinedAnywhere", referenced from:
_main in test-376416.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
由于在C中使用未声明的函数是合法的,因此编译器消息不能是错误。但它确实显示了明确的警告,而没有使用命令行选项专门启用警告。
答案 1 :(得分:0)
由于隐式函数声明,如果启用警告,则会警告您隐式声明thisFunctionIsNotDefinedAnywhere();
,默认情况下返回int
。
如果你添加一个函数原型,那么警告将会消失,但是在链接阶段,编译器将找不到函数定义,并发出错误。