我有一个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的bug?
- 我怎么能解决这个问题,如果我选择不使用
-Ofast
?