我有一个 C 程序,其中包含math.h
并使用sqrt
该头文件中的函数。很奇怪,当我不通过-Ofast
标志时,我的代码无法编译。
如果我使用以下代码编译我的代码:
gcc -std=c99 foo.c
无论是单独使用,还是在该命令中添加任何-O1
,-O2
或-Os
(那些是大写的 O),我都会收到以下错误:
/tmp/ccAcT2Bz.o: In function `sum_of_divisors':
foo.c:(.text+0xb): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
-O3
给出了一个类似但更详细的错误(请注意,我没有sqrt
在 内调用main
):
/tmp/ccBKvvFS.o: In function `sum_of_divisors':
foo.c:(.text+0x5c): undefined reference to `sqrt'
/tmp/ccBKvvFS.o: In function `main':
foo.c:(.text.startup+0xe5): undefined reference to `sqrt'
foo.c:(.text.startup+0xf3): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
但是,-Ofast
编译没有错误,程序运行完美。所以,
- 为什么会这样?为什么必须启用某个优化级别才能编译?它是 GCC 错误吗?
- 如果我选择不使用,我该如何解决
-Ofast
?