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

相关推荐
云絮.6 分钟前
网络原理 ----TCP
服务器·网络·tcp/ip
Ruiery9 分钟前
Linux 6.6内核 PCIe 深度解析(九):复位机制 — 从 FLR 到 Secondary Bus Reset 的降级链
linux·运维·服务器
Wang's Blog16 分钟前
Vibe Coding一人即团队系列59:基于PPTmaster与Claude Desktop的本地可编辑PPT自动化生成方案
运维·自动化·powerpoint
不剪发的Tony老师19 分钟前
Navop:一款工具搞定数据库、SSH、SFTP、远程桌面、AI Agent
运维·数据库·ssh
学烹饪的小胡桃23 分钟前
WGCLOUD支持哪些告警方式
linux·运维·服务器·网络·安全
qq75903536624 分钟前
2026 docker部署Hub 监控中心管理多台服务器硬盘和内存
运维·服务器
wabs66627 分钟前
关于二叉树【力扣107.二叉树的层序遍历II的思考】
数据结构·c++·算法·leetcode·二叉树·层序遍历
Jay Kay29 分钟前
深入理解 RDMA 内存管理:海思 HNS RoCE 架构中的 HEM 表与 MTR 表有什么区别?
服务器·网络·架构
weixin_4407305039 分钟前
socket简单介绍-三次握手四次断开+一个例子
运维·服务器
墨有6661 小时前
#Linux系统命令行操作指南
linux