今天写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编译器的一些信息,在一篇博客中找到了问题所在,博客地址如下
http://anony3721.blog.163.com/blog/static/51197420093762818167/。
下面总结一下,从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 生成所有警告信息。