C / OSX / clang混淆:“未找到符号”发生在链接时而不是编译时

时间:2014-12-27 17:05:55

标签: c macos opengl gcc clang

我有一个问题,但我不确定它是关于 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 有隐式声明吗?我已经编程了很长时间,从来没有碰到过这个。是因为我在GCCMSVC被宠坏了(我似乎记得)在这种情况下会导致编译器错误?或者它与框架链接如何在 OSX 中工作有关,我是新手?

我感谢任何澄清!

2 个答案:

答案 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

如果你添加一个函数原型,那么警告将会消失,但是在链接阶段,编译器将找不到函数定义,并发出错误。