Linux编译器-gcc/g++使用
gcc只能编译c语言,g++可以编译c语言也可以编译g++
背景知识:
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
用vim写出代码后gcc运行
如果代码编译错误,会有语法提示:
代码编译成功后会产生一个可执行程序:
执行命令:
gcc 【文件名】
:不加任何选项默认生成可执行程序
推荐写法:gcc 【源文件名】 -o 【自定义可执行程序名称】
或gcc -o【自定义可执行程序名称】【源文件名】
:生成可执行程序并且可以自定义可执行程序名称,
-o的作用是将生成的可执行程序放到【自定义可执行程序名称】这个文件里去
gcc -E 【源文件名】-o【自定义可执行程序名称.i】
:只进行预处理,将预处理之后的结果放到【自定义可执行程序名称】这个文件里去,
-E的作用是告诉gcc,从现在开始进行程序的翻译,将预处理工作做完就停下来,不要往后走了!
gcc -S 【源文件名】-o【自定义可执行程序名称.s】
:进行程序的翻译,将预处理之后的结果放到【自定义可执行程序名称】这个文件里去,
-S的作用是告诉gcc,从现在开始进行程序的翻译,将编译工作做完,就停下来!
gcc -c 【源文件名】-o【自定义可执行程序名称.o】
:进行程序的翻译,将预处理之后的结果放到【自定义可执行程序名称】这个文件里去,
-c的作用是告诉gcc,从现在开始进行程序的翻译,将汇编工作做完,就停下来!
.==o文件–》==可重定位目标二进制文件,简称目标文件,.obj文件不可以独立执行,虽然已经是二进制了需要经过 链接 才能执行
我们的.o和库是如何链接的?
1.动态链接
2.静态链接
库给我们提供方法的实现,方法的实现就是在库当中!
库其实就是把源文件(.C),经过一定的翻译,然后打包 – 只给你提供一个文件即可,不用给你提供太多的源文件,也可以达到隐藏源文件的目的。
在Linux中,编译形成可执行程序,默认采用的就是动态链接 – 提供动态库
查看是否使用动态库的指令ldd
:
查看是动态库还是静态库的指令file
:
在Linux中,如果要按照静态链接的方式,进行形成可执行程序,需要添加-static选项 – 提供静态库:gcc mycode.c -o 【自定义文件名】 -static
Linux中是没有安装静态库的,需要自己安装
C语言:sudo yum install -y glibcstatic
C++: sudo yum install -ylibstdc++-static
动态库因为是共享库,有效的节省资源(磁盘空间,内存空间,网络空间等)[优]
动态库一旦缺失,导致各个程序都无法运行[缺点]
静态库,不依赖库,程序可以独立运行[优点],
体积大,比较消耗资源[缺]
make/Makefile
make是一个命令
makefile是一个文件,当前目录下的文件
依赖关系、依赖方法
make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译!(在文件内容和属性没有被修改的情况下,一般只会编译1次):
一定是源文件形成可执行,现有源文件,才有可执行,一般而言,源文件的最近修改时间 比 可执行文件要老的
如果我们更改了源文件,历史上曾经还有可执行,那么源文件的最近修改时间,一定要比可执行程序要新!
只需要比较,可执行程序的最近修改时间 和 源文件的最近修改时间
.exe 新于 .c 源文件是老的,不需要重新编译
.exe 老于 .c 源文件是老的,需要重新编译
查看文件的时间的指令stat 【文件】
(Modify
:文件内容,Change
:文件属性)
如果想要一直被执行:.PHONY
(伪目标)
特殊符号:$@ $^
执行多个程序
在makefile中
即可形成两个可执行程序