【发布时间】:2015-05-28 20:24:15
【问题描述】:
我正在尝试在各种优化级别使用 clang 编译以下代码:
#include <stdio.h>
inline int foo() { return 42; }
int main() {
printf("%d\n", foo());
}
-O1,-O2,-O3,-Os编译成功,使用-O0编译失败:
$ clang -O0 -o main main.c
Undefined symbols for architecture x86_64:
"_foo", referenced from:
_main in main-8b9319.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
-O0 的失败(和解决方法)可以用Clang's inline compatibility 来解释,但是我天真地认为无论优化级别如何,这都会失败。似乎在-O1 及更高版本启用的一些优化正在做一些事情来防止发生此链接错误,但我很好奇它们是哪些优化以及为什么它们似乎具有不同的语义而不是在@单独使用inline 987654332@.
【问题讨论】:
-
尝试添加
static。例如static inline int foo() { return 42; } -
是的,添加
static解决了-O0的问题,但我问的是为什么它确实在更高的优化级别上编译。
标签: c optimization clang inline c99