当我编译下面的精简程序时,我从链接器收到以下错误:
$ gcc -std=c99 -O3 powltest.c -o powltest
/tmp/ccYkWTGI.o: In function `main':
powltest.c:(.text+0x7a): undefined reference to `powl'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果我注释掉该行sscanf(),则编译成功并且程序运行正确,因为功能减少了.如果我注释掉包含的行,它也可以工作powl()
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
unsigned int bits = 5;
unsigned int n = 0;
unsigned long long start = 0;
n = sscanf(argv[1], "%u", &bits);
printf("%u\n", bits);
start = powl(2, bits) - 1;
printf("%llu\n", start);
}
Run Code Online (Sandbox Code Playgroud)
以下是版本:
$ gcc --version
gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1
$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.20
Run Code Online (Sandbox Code Playgroud)
结果相同:
$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51)
$ ld --version
GNU ld version 2.17.50.0.6-14.el5 20061020
Run Code Online (Sandbox Code Playgroud)
运行:
$ ./powltest 42 # commented-out sscanf()
5
31
$ ./powltest 42 # commented-out powl()
42
0
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
当您注释掉sscanf调用时,所有变量都具有在编译时已知的值,并且编译器的优化器能够确定powl调用的结果,而无需实际调用任何声明的函数math.h.
取消注释scanf调用时,优化器无法在编译时确定powl调用的结果,因此它必须调用实际powl函数,该函数位于您必须与程序链接的单独库中-lm.
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |