一.条件编译
条件编译:指在编译阶段 根据条件决定哪些代码参与编译、哪些不编译,未满足条件的代码会被直接忽略,不生成目标代码。
它是 C 语言预处理阶段的功能,用预处理指令实现。
cpp
#if 常量表达式
// 代码段1
#elif 常量表达式
// 代码段2
#else
// 代码段3
#endif


可以在文件外进行宏定义,这里定义的是M=100 -o是形成可执行文件
程序构建的过程:1.预处理2.编译3.汇编4.连接
为什么c/c++编译,需要先汇编:因为历史是二进制代码->汇编代码->c代码
先有汇编语言还是汇编语言写的编译器?答案是先有汇编语言,编译器是上一代二进制写的,直到我们使用汇编语言写的编译器,就淘汰上一代.叫编译器自举.
二.ldd工具
bash
ldd ./a.out"可执行程序"
ldd /bin/ls
-ldd 是 Linux 系统中用于查看可执行文件或共享库(Shared Library)所依赖的共享库文件 的命令行工具.
库:
所谓库,其实是一套方法或者数据集,为我们开发退供最基本的保证(基本接口,功能,加速我们二次开发)
1.静态库:Linux(.so) widows(.dll)
2.动态库:Linux(.a) widows(.lib)
动静态库对比:
1.动态库形成的可执行程序一定很小
2.可执行程序对静态库的依赖度小,动态库不能缺失
3.程序运行.需要加载到内存,静态链接的,在内存中会出现大量的重复代码.
4.动态链接,比较节省内存和磁盘资源
我们自己写的代码和库中的方法链接
动态链接:就是储存方法的地址,通过地址来找到库中的方法
共享库被多个程序共享,一旦缺失,会导致所有的程序,无法执行.
静态链接:直接把方法从库里面复制过来
在我们gcc/g++工具中默认就是动态链接,我们要转变成静态链接,但是我们需要先装对应的静态库
cpp
gcc code.c -o code.static -static
//-static选项
yum install glibc-static
//安装c静态库
yum install libstdc++-static
//安装c++静态库
动态库的本质**(内存共享)**:动态库也会复制到内存,但是是把语言层面公共的代码,在内存中只出现一份.
解决sudo问题:
在超级用户下
bash
vim /etc/sudoers

找到配置文件,将普通用户的sudo权限加上去

linux模块化编程
和我们在vs里面的操作一样

如果你只想对你的室友提供.h文件但是不给.c实现的源码,就可以先将.c文件编译成.o文件就不会暴露源码了
bash
gcc -c main.c
//main.o
三.Linux项目自动化构建工具-make/Makefile
make是一个命令,Makefile是一个文件


这样我们就不用写gcc命令了,就直接执行make命令就行了

-o选项是output的意思,-o选项后面一定需要接上输出文件名.
make命令扫描makefile文件的时候,从上向下扫描,默认形成第一个目标文件.(这里默认是gcc -o ...)
想要执行clean就使用make clean,一般可执行的编译在第一位make就直接执行第一个,

-f选型是force(强制删除)
我们不仅需要将文件进行编译,也需要将文件进行清理,清理是使用.PHONY:clean
那.PHONY:clean是什么呢?
这是一个伪目标,就是不和已经存在的文件冲突(这里是clean),执行make clean是总会执行对应的命令,而不会被clean同名文件所影响.为什么编译不是总是执行呢?因为代码量大的时候总是进行编译的成本太高,make不再编译的依据是modify的时间早晚,更早就不会编译了..PHONY的原理就是忽略modify的时间.
在makefile文件里面注释是用#
在makefile文件里面还可以设置变量(有点像宏定义)

echo = 显示文字 / 打印消息,echo本身也会显示,所以我们使用@使得命令不回显.
下面是makefile version1

Makefile 规定:引用变量必须用 $() 包裹!
这样我们的编译和删除的命令就全部都是变量来表示的,和宏定义很象.

我们运行一下,如图

现在我们项目里面有多个文件,而上面的只能一次宏替换一个.c文件,下面就进行多文件的替换
下面的是makefile version2

