Linux_gcc
关于gcc的一些笔记。
程序的翻译
gcc/g++是一个编译器。
预处理:头文件展开、条件编译、宏替换、去注释
编译:C语言汇编语言
汇编:汇编->可重定位目标二进制文件,不可以被执行,bin.obj,只把我们的代码进行翻译形成二进制目标文件
链接:将我们自己形成的.obj文件和库文件进行合并,形成可执行程序。
ESc iso
gcc -o 生成文件名称 源文件
-E 从现在开始进行程序的翻译,但做完预处理后结束 myfile.i
-S 从现在开始进行程序的翻译,做完编译后停下来 myfile.s
-c 从现在开始进行程序的汇编,做完汇编后停下来 myfile.o
链接
我们为什么能在Linux下进行C、C++代码的编写和编译?
答:Linux系统默认已经携带了语言级别的头文件和语言对应的库。
库
库分为动态库和静态库,本质上库也是文件。
静态库:libxxxxx.a
动态库:libxxxxx.so
区别库时把前缀和后缀去掉,中间的内容就是名字
windows下静态库为.lib文件,动态库为.dll文件
在我们安装VS2022/2019时,重要的一个工作就是下载对应的头文件和库文件!
我们所使用的指令有相当一部分是使用C写的!如何看待指令呢?指令就是程序、工具。
- 库分为静态库(专门让编译器对用户的程序进行静态链接的)和动态库(专门让编译器对用户的程序进行动态链接的)
- 静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己的可执行程序中。
- 动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位置。
- 静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行。
- 动态链接成功:我们的程序,依赖动态库,一旦动态库缺失,我们的程序便无法运行。
- 静态库:因为自身拷贝的问题,比较浪费控件。
- 动态库:因为可以做到被大家共享方法,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间。
- 静态库vs动态库:Linux默认使用的是动态链接和动态库,gcc -static可以进行静态链接。
云服务器安装的Linux大多默认为动态链接,静态链接安装指令:yum install glibc-static libstdc+±static -y
假如我们是程序,当我们需要电脑时,可以选择去网吧(动态库),需要记住网吧(动态库)地址,也可以自己买一台电脑回家(静态库),要花(内存)买回家。
make与makefile
makefile是围绕依赖关系和依赖方法构建的一个自动化编译工具。
依赖关系与依赖方法
make:myfile.o
gcc -c -o myfile myfile.s
make:myfile.s
gcc -S -o myfile.s myfile.i
make:myfile.i
gcc -E -o myfile.i myfile.c
执行顺序类似“栈”,是根据依赖关系来寻找所需要的文件的
makefile:test.c
gcc -o test test.c
!PHONY:clean
clean:
rm -f test
添加信任用户
/etc/sudoers