gcc使用读书笔记

声明:以下内容为阅读《linux C 编程-从初学到精通》时做的笔记。

使用gcc编译程序时,编译过程细分为4个阶段:

  • 预处理(Pre-Processing)
  • 编译(Compiling)
  • 汇编(Assembling)
  • 链接(Linking)

编译初步

假如有文件hello.c,直接使用gcc hello.c ,则gcc编译默认产生a.out,运行该文件输入./a.out

可以使用-o选项改变编译后的文件名,如 gcc -o hello hello.c,编译后产生hello,执行./hello即可运行。


gcc 的警告提示功能

一般使用gcc编译时,加上-Wall 会产生尽可能多的有用警告信息。

如 gcc -Wall hello.c -o hello,编译时有警告会输出,无则不输出警告信息。

对Linux程序员来讲,gcc给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用gcc编译源代码时,始终带上-Wall选项,并把它逐渐培养成一种习惯,这对找出常见的隐式编程错误是很有帮助的。


优化gcc

编译时使用-O可以告诉gcc同时减少代码的长度和执行时间。

-O2告诉gcc除了完成-O的优化外,同时还进行一些额外的调整工作,如处理器指令调度。

-O3告诉gcc除了完成-O2的优化外,还包括循环展开和其他一些与处理器特性相关的优化工作。

一般都喜欢使用-O2选项,因为它在优化长度,编译时间和代码大小之间取得了理想的平衡点。

试验时,可以使用time统计该程序运行时需要的时间。


链接库

linux下头文件(.h)默认路径为/usr/include/,而库文件(.so或.a)的默认路径是/usr/lib/。在linux下写程序时,有时候需要用第三方的函数库(如自己写的),这种情况编译时,需要指定所需要的头文件和库文件的路径。

gcc采用搜索目录的办法来查找所需要的文件,-I选项可以向gcc的头文件搜索路径添加新的目录。如已写有foo.c文件,而在/home/linux/include/目录下有编译该程序需要的头文件,为了让gcc顺利找到它们,使用-I选项

gcc foo.c -I /home/linux/include -o foo

同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向gcc的库文件搜索路径添加新的目录。如在/home/linux/lib/目录下有程序foo.c程序链接时所需要的库文件libfoo.so,为了让gcc顺利找到它,并成功编译成可执行文件foo,可以使用下面命令:

gcc foo.c -L /home/linux/lib -lfoo -o foo

在上面的编译命令中,它指示gcc去链接库文件libfoo.so。linux下的库文件在命名时有一个约定,那就是应该以“lib”三个字母开头,由于所有库文件都遵循了同样的规范,因此在使用-L选项指定链接的库文件名时可以省去“lib”三个字母,也就是gcc在对“-lfoo”字串进行处理时,会自动去链接名为“libfoo.so”的文件。

 另外,linux下的库文件分为两大类,分别是动态链接库(.so)和静态链接库(.a),两者的区别在于程序执行时所需的代码是在运行时动态加载的还是编译时静态加载的。默认情况下,gcc在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。如

gcc foo.c -L /home/linux/lib -static -lfoo -o foo


同时编译多个源程序

假如有一个有foo1.c,foo2.c,foo3.c三个源文件组成的程序,为了对它们进行编译,并生成可执行程序foo,可以使用下面命令:

gcc foo1.c foo2.c foo3.c -o foo

 这条命令相当于依次执行下面四条命令:

gcc -c foo1.c -o foo1.o

gcc -c foo2.c -o foo2.o

gcc -c foo3.c -o foo3.o

gcc foo1.o foo2.o foo3.o -o foo

 如果有更多的文件需要编译的话,就需要借助make工具。

原文地址:https://www.cnblogs.com/ivorfeng/p/3058959.html