今天写C程序遇到了一个问题,错误提示如下:
/tmp/ccDjB9kK.o: In function `is_prime':
prime_estimate.c:(.text+0x1f): undefined reference to `sqrt'collect2: ld returned 1 exit status上述错误是在使用gcc的时候产生的,编译命令为:
gcc my_prime_est.h prime_estimate.c prime_est_main.c
把上面的命令替换为用g++编译
gcc my_prime_est.h prime_estimate.c prime_est_main.c
没有错误,生成了正常的可执行程序。
开始,我怀疑是不是头文件包含没写好,检查过后,发现头文件包含正常,而且g++编译可以通过
于是去百度gcc编译器的一些信息,在一篇博客中找到了问题所在,博客地址如下
。
下面总结一下,从c程序的源代码到可执行程序的生成,需要两个大的步骤:
一、编译,以文件为单位,把源文件编译为目标文件,以.o结尾,在编译之前,会先完成包含头文件等预处理,即处理所有以#号开始的行
二、链接,有的程序包含多个源文件,从而会有多个目标文件,这些目标文件需要链接起来才能组成可执行程序
其实上面遇到的错误,是链接错误,gcc在链接期间,如果用到某些函数库里的函数,需要显示指出函数库,具体方法是在命令中加入-l函数库名,例如数学函数库的完整名称为libm.so,那么指出需要用到的函数库的命令为 -lm,即去掉lib和.so之后的部分,注意这里的 l 是小写的L,而不是I。
g++要更智能一些,在链接期间会自动寻找需要的函数库,于是就出现了上面的现象:gcc不行,g++可以
下面列出一些gcc和g++编译和链接的时候常用的命令行选型:
选项 解释
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,例如 asm 或 typeof 关键词。-c 只编译并生成目标文件。-DMACRO 以字符串“1”定义 MACRO 宏。-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。-E 只运行 C 预编译器。-g 生成调试信息。GNU 调试器可利用该信息。-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。-lLIBRARY 连接时搜索指定的函数库LIBRARY。-m486 针对 486 进行代码优化。-o FILE 生成指定的输出文件。用在生成可执行文件时。-O0 不进行优化处理。-O 或 -O1 优化生成代码。-O2 进一步优化。-O3 比 -O2 更进一步优化,包括 inline 函数。-shared 生成共享目标文件。通常用在建立共享库时。-static 禁止使用共享连接。-UMACRO 取消对 MACRO 宏的定义。-w 不生成任何警告信息。-Wall 生成所有警告信息。