Linux开发工具结尾 _make

一.条件编译

条件编译:指在编译阶段 根据条件决定哪些代码参与编译、哪些不编译,未满足条件的代码会被直接忽略,不生成目标代码。

它是 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

-lddLinux 系统中用于查看可执行文件或共享库(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

相关推荐
戴为沐1 天前
Linux内存扩容指南
linux
zylyehuo1 天前
Linux 彻底且安全地删除文件
linux
刘马想放假2 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
用户805533698032 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297912 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
北域码匠3 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Web3探索者4 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo4 天前
Linux系统中网线与USB网络共享冲突
linux
荣--4 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计