Bootstrap

linux-gcc/g++ 和makefile的使用

gcc和g++是一款编译语言的编译器,可以在linux上编译c语言文件和c++文件。

格式:

gcc/g++ 目标文件 

在不加任何选项的时候,编译出来的可执行文件名默认是 a.out。

 gcc编译

gcc在将文件编译形成可执行代码,其实中间还分为好几步,可以通过选项来一步一步编译。

1.预处理:预处理就是将编写好的代码里的宏替换掉,去掉注释,展开头文件,条件编译

gcc -E 目标文件 -o 目标文件.i

2.编译:汇编会将写好的代码转成汇编语言

gcc -S 目标文件

gcc -S 目标文件 -o 编译后文件名.s

3.汇编:将汇编语言转化成计算机可以看得懂的二进制代码

gcc -c 目标文件

gcc -c 目标文件 -o 汇编后文件名.o

每一个步骤的文件后缀可以都填.c,但这里建议填对应的后缀,可以看出这个文件到了哪一步, -o后面是一定执行后的文件名

4.链接:与包含的库文件进行链接形成可执行文件

gcc 目标文件 -o 链接后文件名

链接的方式分为两种,一种是静态链接,一种是动态链接,默认是动态链接(如果动态库找不到,才回去找静态库),如果想要静态链接,需要再加一个选项

gcc 目标文件 -o 链接后文件名 -static

静态库默认是不安装的,想要安装需要使用yum安装。

yum install glibc-static     c语言静态库

yum install -y libstdc++-static       c++静态库
 

头文件路径:

/usr/include 

库文件路径:

/usr/lib64/libbc

gcc和g++:

gcc只可以编译c语言而g++既可以编译c++又可以编译C语言,是因为c语言和c++的库文件路径是不一样的,在编译的时候需要去找库文件的路径,gcc只会寻找c语言的库文件,没法寻找c++的库文件,而c++两个库文件都可以找。

 debug和release

默认的编译方式是release,如果想要以debug方式编译,需要加上一个选项

gcc 目标文件 -o 链接后文件名 -g

debug模式可以进行调试

makefile

makefile是一个可以快捷使用自己设置的指令的自动化方法。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile 定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
makefile 带来的好处就是 ——“ 自动化编译 ,一旦写好,只需要一个 make 命令,整个工程完全自动编 译,极大的提高了软件开发的效率
格式:
可以形成的可执行文件:可执行文件所依赖的源文件       这一行是可执行文件和源文件的依赖关系 
        将源文件给编译成可执行文件的方式         这一行是用gcc这样的编译器编译源文件

例:

 在makefile里,可以用 $@ 来表示依赖关系当中的执行后文件,$^来表示依赖关系中的依赖文件,如果有多个依赖文件,这样用比较方便。

这里将gcc编译分成了好几步,

1.test依赖于test.o文件,但是test.o文件不存在,那就需要先形成test.o

2.test.o依赖于test.s文件,但是test.s文件不存在,那就需要先形成test.s

3.test.s依赖于test.i文件,但是test.i文件不存在,那就需要先形成test.i

4.test.i依赖于test.c文件,test.c文件存在,用依赖方法形成test.i文件,一步一步返回知道形成test可执行文件。

在makefile里面,可以用 .PHONY:来修饰 $@文件,让该文件的依赖方法总是能够执行。

例:

不能执行的情况:

make后,如果依赖文件没有变动,就不会重新编译,用.PHONY修饰后就可以编译。

make

在mkafile里面编译好之后,直接在命令行输入make,就会执行第一行的依赖关系对应的依赖方法 ,除了第一行以外需要在make后面加上字符串,这个字符串是依赖关系中左边的部分

例:

make clean

如果想要make就可以直接执行make clean的依赖方法,需要将clean放到第一行。

make后,如果依赖文件没有变动,就不会重新编译

每次make之后,对应的依赖方法都会显示到屏幕上,如果想不显示出来,可以在依赖方法前面+@。

;