Makefile与CMake回顾

devtools/2024/11/15 4:14:52/

一、Makefile

1.gcc编译

预处理--->编译---->汇编---->链接

预处理:展开头文件,替换宏,删除注释

gcc -E ***.c -o ***.i

编译:检查语法的正确性,生成汇编文件

gcc -S ***.i -o ***.s

汇编:把汇编文件转换为二进制文件

gcc -c ***.s -o ***.o

链接:把二进制文件链接为可执行文件

gcc ***.o -o 可执行文件

2.规则

目标:依赖

(tab)命令1

(tab)命令2

3.实例

3.1: .PHONT:为目标,防止当有一个名为clean的文件时,makefile不知道要执行哪个

#目标 :依赖
var = hello\hqyj
hello : hello.ogcc hello.o -o hello
hello.o : hello.cgcc -c hello.c -o hello.o.PHONY : clean   #伪文件
clean:rm hello.orm hello
print:@echo ${var}

(加入@之后就不会打印执行的语句,直接打印输出的值)

3.2 父makefile读取到子中的makefile信息

父:

#目标 :依赖
include ./dir/makefile
var = hello\hqyj
hello : hello.ogcc hello.o -o hello
hello.o : hello.cgcc -c hello.c -o hello.o.PHONY : clean   #伪文件
clean:rm hello.orm hello
print:echo ${subMakefile}

子:

subMakefile = ./dir/Makefile

3.3在makefile中加入头文件目录

#目标 :依赖
include ./dir/makefile
INCLUDE = -I./inc
var = hello\hqyj
hello : hello.ogcc hello.o -o hello
hello.o : hello.cgcc -c hello.c -o hello.o ${INCLUDE}.PHONY : clean   #伪文件
clean:rm hello.orm hello

3.4存在多个相同目标时,以最后一个目标为准

print:@echo ${.INCLUDE_DIRS}@echo ${Hello}@echo ${HOME}
print:@echo "hello"

3.5 通配符

$@:所有目标
$^:所有依赖
$<:第一个依赖%.o:%.c   模式匹配,唯一的匹配关系,一般用在Makefile目标和依赖间的匹配关系

二、CMake

1.产生过程

项目代码--->CMakeLists.txt(脚本文件)--->cmake(执行命令)--->生成makefile--->make(执行命令)

2.实例

2.1.编译文件

mkdir build

在build 下敲cmake ..命令

再执行make就会生成可执行文件app

cmake_minimum_required(VERSION 3.0)#cmake的最低版本号
project(test)#定义工程名字
add_executable(app add.cpp div.cpp mult.cpp sub.cpp main.cpp)#定义工程生成一个可执行文件

2.2 set的使用

set(SRC *.cpp)这样的写法是错误的,需要通过file (GLOB SRC "*.cpp")查找当前路径下的所有app文件赋值给SRC

cmake_minimum_required(VERSION 3.0)#cmake的最低版本号
project(test)#定义工程名字
#set(SRC add.cpp div.cpp mult.cpp sub.cpp main.cpp)
file (GLOB SRC "/home/ubuntu/cmake/*.cpp")
set(EXECUTABLE_OUTPUT_PATH ./test)
set(CMAKE_CXX_STANDARD 11)#设置c++编译器的版本号
add_executable(app ${SRC})#定义工程生成一个可执行文件


http://www.ppmy.cn/devtools/133760.html

相关文章

【Python进阶】Python网络协议与套接字编程:构建客户端和服务器

1、网络通信基础与网络协议 1.1 网络通信模型概述 网络通信是信息时代基石&#xff0c;它如同现实世界中的邮递系统&#xff0c;将数据从一处传递到另一处。其中&#xff0c;OSI七层模型与TCP/IP四层或五层模型是理解和构建网络通信的基础。 1.1.1 OSI七层模型与TCP/IP四层/…

Go语言的并发安全与互斥锁

线程通讯 在程序中不可避免的出现并发或者并行&#xff0c;一般来说对于一个程序大多数是遵循开发语言的启动顺序。例如&#xff0c;对于go语言来说&#xff0c;一般入口为main&#xff0c;main中依次导入import导入的包&#xff0c;并按顺序执行init方法&#xff0c;之后在按…

VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

如何对PHP的API接口权限认证

对PHP的API接口进行权限认证是确保只有授权的用户或应用程序可以访问特定API资源的重要环节。以下是一些常用的PHP API接口权限认证方法&#xff1a; 一、API密钥&#xff08;API Key&#xff09; API密钥是一种简单的鉴权方式&#xff0c;通常用于限制对API的访问。每个用户…

IT运维的365天--019 用php做一个简单的文件上传工具

前情提要&#xff1a;朋友的工作室&#xff0c;有几个网站分布在不同的服务器上&#xff0c;要经常进行更新&#xff0c;之前是手动复制压缩包到各个服务器去更新&#xff08;有写了自动更新的Shell脚本&#xff09;。但还是觉得太麻烦&#xff0c;每次还要手动传输压缩包到各个…

SpringBoot(八)使用AES库对字符串进行加密解密

博客的文章详情页面传递参数是使用AES加密过得&#xff0c;如下图所示&#xff1a; 这个AES加密是通用的加密方式&#xff0c;使用同一套算法&#xff0c;前端和后端都可以对加密之后的字符串进行加密解密操作。 目前线上正在使用的是前端javascript进行加密操作&#xff0c;将…

【RabbitMQ】之高可用集群搭建

一、RabbitMQ 集群简介 1、默认集群原理1-1、RabbitMQ 集群简介 单台 RabbitMQ 服务器处理消息的能力是有瓶颈的&#xff0c;而且可靠性还无法保证&#xff0c;所以需要通过集群来提高消息的吞吐量和提高数据可靠性。 由于 RabbitMQ 本身是基于 Erlang 编写&#xff0c;而 Er…

单体架构 IM 系统之核心业务功能实现

在上一篇技术短文&#xff08;单体架构的 IM 系统设计&#xff09;中&#xff0c;我们讨论了在 “用户规模小、开发人员少、开发时间短” 的业务背景下&#xff0c;采取 “怎么简单怎么做&#xff0c;怎么快怎么来” 的研发策略&#xff0c;于是设计了 单体架构的IM系统&#x…