前不久,就编译一条POW函数时,入口参数不能为变量的问题,经过多番查询,找到了解决办法。
以前的程序;
(这个程序是转载,目的是为了更容易说明问题)
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
1 int main(void)
2 {
3 int i=2;
4 printf("%f\n",pow(2,i)); //结果应该是4吧?
5
6 return 0;;
7 }
[root@localhost c_work]# gcc -g int2str.c -o a
/tmp/ccQjoM74.o: In function `main':
/root/work_bench/c_work/int2str.c:4: undefined reference to `pow'
collect2: ld 返回 1
LINE 4 改成pow(2,2)就编译通过了
请教一下这是为什么?
gcc -g int2str.c -o a –lm
解决二;
gcc yourfile.c -lm
解决三;
linux-0gt0:~ # cat 1.c
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i=2;
printf("%f\n",pow(2,i)); //.....4..
return 0;;
}
linux-0gt0:~ # gcc 1.c
/tmp/ccsizWna.o: In function `main':
1.c:(.text+0x29): undefined reference to `pow'
collect2: ld returned 1 exit status
linux-0gt0:~ # gcc -O2 1.c
linux-0gt0:~ #
也就是不加优化选项,那么产生的汇编码中是有pow调用的,而优化后,汇编码中是不含有这个调用的
但是,
这个-lm在哪里可以找到?
[root@localhost c_work]# gcc -g int2str.c -o a -lm
[root@localhost c_work]# gcc --help //找不到-lm这个选项阿?
用法:gcc [选项] 文件...
选项:
-pass-exit-codes 在某一阶段退出时返回最高的错误码
--help 显示此帮助说明
--target-help 显示目标机器特定的命令行选项
(使用‘-v --help’显示子进程的命令行参数)
-dumpspecs 显示所有内建 spec 字符串
-dumpversion 显示编译器的版本号
-dumpmachine 显示编译器的目标处理器
-print-search-dirs 显示编译器的搜索路径
-print-libgcc-file-name 显示编译器伴随库的名称
-print-file-name=<库> 显示 <库> 的完整路径
-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径
-print-multi-directory 显示不同版本 libgcc 的根目录
-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射
-print-multi-os-directory 显示操作系统库的相对路径
-Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器
-Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器
-Wl,<选项> 将逗号分隔的 <选项> 传递给链接器
-Xassembler <参数> 将 <参数> 传递给汇编器
-Xpreprocessor <参数> 将 <参数> 传递给预处理器
-Xlinker <参数> 将 <参数> 传递给链接器
-combine 将多个源文件一次性传递给汇编器
-save-temps 不删除中间文件
-pipe 使用管道代替临时文件
-time 为每个子进程计时
-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件
-std=<标准> 指定输入源文件遵循的标准
--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录
-B <目录> 将 <目录> 添加到编译器的搜索路径中
-b <机器> 为 gcc 指定目标机器(如果有安装)
-V <版本> 运行指定版本的 gcc(如果有安装)
-v 显示编译器调用的程序
-### 与 -v 类似,但选项被引号括住,并且不执行命令
-E 仅作预处理,不进行编译、汇编和链接
-S 编译到汇编语言,不进行汇编和链接
-c 编译、汇编到目标代码,不进行链接
-o <文件> 输出到 <文件>
-x <语言> 指定其后输入文件的语言
允许的语言包括:c c++ assembler none
‘none’意味着恢复默认行为,即根据文件的扩展名猜测
源文件的语言
以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的
不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。
好了。如果有朋友还没有解决该类问题,或者有更好的办法,希望发帖,大家一起讨论。谢谢