Linux下的C编程:gcc编译学习笔记

什么是gcc

Linux环境下的一个C/C++编译器

编译过程

  • 预处理:展开宏定义;处理库文件;处理条件编译;删除注释等
    gcc -E source.c -o rename.i (一般使用的命令)
    gcc -E -C source.c -o rename.i(加入选项-C,阻止删除注释)
    gcc -E source.c -o rename.i -D CONVERT (选项-D可加入宏定义,搭配 ifdef 可实现调试等功能)
  • 编译:高级语言–>汇编语言
    gcc -S source.c(.i) -o rename.s
  • 汇编:汇编语言–>机器语言
    gcc -c source.c(.s) -o rename.o
  • 链接:生成可执行文件
    gcc source.c(.o) -o rename
    在链接阶段加入参数-l、-L、-I可以链接需要用到的库文件、头文件
  • 参数-l: 指定要链接的库,比如要链接数学库,则加入参数-lm,因为数学库文件的全名是libm.so,去掉前缀lib和后缀.so就是库名m,其他库同理。
  • 参数-L:在/lib/usr/lib/usr/local/lib三个目录下的库文件可以直接使用-l命令连接,对于其他的库文件,需要用-L去指定所在目录,如:-L/xx/yy -lhello这个命令可以链接位于/xx/yy目录下的libhello.so库
  • 参数-I: 指定头文件所在目录,适用于源文件和头文件不在同一个目录下

注:上面用到的 -S、-c 等命令不仅仅能表示单个过程,如果使用命令:gcc -c source.c -o rename.o 表示的是预处理、编译、汇编,但不链接,生成 .o 文件。

多文件编译

适用于含有自己编写的头文件等情况

  • 如果结构比较简单,直接编译即可:gcc source1.c source2.c -o prog (也可以使用通配符*.c)
  • 为了免去修改一个文件都要重新编译所有文件的消耗,可以分别将每一个 .c 源文件用 -c命令 编译为.o文件,最后再进行链接
  • 编写makefile文件

编写Makefile

通过编写Makefile文件规定编译的过程和规则

  • 基本格式:
target1:requires
	command1
target2:requires
	command2
	......
operator:
    command

target是要生成的目标文件,requires是生成target所需的依赖文件。第一个target是最终的目标文件。operator是自定义的操作,常见的是clean命令,用于清理中间文件。

clean:
	rm *.o *.s
  • 通过make命令调用Makefile文件,make + 命令 调用自定义的命令

你可能感兴趣的:(Linux)