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

相关推荐
MXsoft6181 小时前
【无标题】
运维·自动化
天疆说1 小时前
在 Ubuntu 22.04 上安装 Ghostty 终端
linux·运维·ubuntu
buhuizhiyuci1 小时前
熟练使用Linux编译工具(gcc, g++, make, makefile)
linux·运维·服务器
健康平安的活着1 小时前
使用tsf分析服务器的内存使用情况【经典版】
运维·服务器
wechatbot8882 小时前
企业微信 iPad 协议客服机器人自动化管理平台开发指南
java·运维·微信·自动化·企业微信·ipad
草莓熊Lotso2 小时前
从 LLM 底层原理到 LangChain 全链路打通:大模型应用开发新征程
linux·运维·服务器·人工智能·langchain
zs宝来了2 小时前
网络篇11-本机网络IO工作原理
服务器·网络·tcp/ip
cyber_两只龙宝2 小时前
【Oracle】Oracle数据库的登录验证
linux·运维·数据库·sql·云原生·oracle
c++圈来了个新人2 小时前
C++类和对象(中)
c语言·开发语言·数据结构·c++·考研·算法