CMake

一.make原理和简单使用

make是cmake的过渡工具。

文件准备:

文件结构:

main.cpp
复制代码
#define _FUNCTIONS_H_
#include<iostream>
#include "functions.h"
using namespace std;

int main(){
	printhello();

	cout<<"This is main(): "<<endl;
	cout<<"The factorial of 5 is : "<<display(5)<<endl;
	return 0;
}
dj
display.cpp
复制代码
#include "functions.h"
int display(int n){
	if(n==1)
		return 1;
	else
		return n*display(n-1);
}
functions.h
复制代码
#ifdef _FUNCTIONS_H_
#define _FUNCTIONS_H_
void printhello();
int display(int n);
#endif
printhello.cpp
复制代码
#include<iostream>
#include "functions.h"
using namespace std;

void printhello(){
    int i;
    cout<<"Hello World!"<<endl;
}
普通编译:
复制代码
g++ main.cpp display.cpp printhello.cpp -o main

./main
  • 只适合小型项目,对于大型项目来说效率低下

(一)make工具-----makefile

语法:

目标\]: \[依赖

(tab制表符)[命令]

  • 目标:规则的目标,可以是 Object File(一般称它为中间文件),也可以是可执行文件,还可以是一个标签;
  • 依赖:是我们的依赖文件,要生成 targets 需要的文件或者是另一个目标。可以是多个,也可以是没有;
  • 命令:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。

(二)简单使用(Makefile文件编写)

version-1
cpp 复制代码
hello: main.cpp printhello.cpp factorial.cpp
	g++ -o hello main.cpp printhello.cpp factorial.cpp
version-2
cpp 复制代码
CXX = g++
TARGET = hello 
OBJ = main.o printhello.o factorial.o

$(TARGET): $(OBJ)
	$(CXX) -o $(TARGET) $(OBJ)

main.o: main.cpp
	$(CXX) -c main.cpp

printhello.o: printhello.cpp
	$(CXX) -c printhello.cpp

factorial.o: factorial.cpp
	$(CXX) -c factorial.cpp
version-3
cpp 复制代码
CXX = g++
TARGET = hello 
OBJ = main.o printhello.o factorial.o

CXXFLAGS = -c -Wall

$(TARGET): $(OBJ)
	$(CXX) -o $@ $^

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

.PHONY: clean
clean:
	rm -f *.o $(TARGET)
version-4
cpp 复制代码
CXX = g++
TARGET = hello 
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC))

CXXFLAGS = -c -Wall

$(TARGET): $(OBJ)
	$(CXX) -o $@ $^

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

.PHONY: clean
clean:
	rm -f *.o $(TARGET)

在Makefile中,自动化变量是一种特殊的变量,它们在规则的命令中使用,用于表示相关的文件或命令。以下是常见的自动化变量解析符:

  1. $@ :代表规则的目标文件名。当一个规则有多个目标时,$@代表当前正在构建的目标。

  2. $< :代表规则的第一个依赖文件名。当一个规则有多个依赖文件时,$<代表第一个依赖文件。

  3. $^:代表规则的所有依赖文件列表,以空格分隔。如果有重复的依赖文件,它们只会出现一次。

  4. $?:代表比目标新的所有依赖文件列表,以空格分隔。如果没有依赖文件比目标新,则为空。

  5. $* :代表目标文件去除后缀之后的部分。例如,如果目标文件是foo.o,那么$*就代表foo

  6. $(@D) :代表目标文件所在的目录。例如,如果目标文件是build/foo.o,那么$(@D)就代表build/

  7. $(@F) :代表目标文件的文件名部分。例如,如果目标文件是build/foo.o,那么$(@F)就代表foo.o

  8. $n(n≥1):传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 ,第二个参数是1,第二个参数是2>。

  9. $# :传递给脚本或函数的参数个数。

这些自动化变量解析符可以方便地在Makefile中使用,以引用相关的文件名或目录。通过结合这些变量,可以更加灵活和高效地编写自动化构建规则

相关推荐
汉克老师10 分钟前
第十四届蓝桥杯青少组C++选拔赛[2023.1.15]第二部分编程题(2 、寻宝石)
c++·蓝桥杯·蓝桥杯c++·c++蓝桥杯·蓝桥杯选拔赛
Jelena技术达人12 分钟前
淘宝/天猫按图搜索(拍立淘)item_search_img API接口实战指南
算法·图搜索算法
大锦终13 分钟前
【Linux】进程间通信
linux·运维·服务器·c++
闪电麦坤9516 分钟前
C/C++项目练习:命令行记账本
开发语言·c++
Adorable老犀牛22 分钟前
阿里云-基于通义灵码实现高效 AI 编码 | 8 | 上手实操:LeetCode学习宝典,通义灵码赋能算法高效突破
学习·算法·leetcode
kyle~25 分钟前
python---PyInstaller(将Python脚本打包为可执行文件)
开发语言·前端·python·qt
望获linux27 分钟前
【实时Linux实战系列】规避缺页中断:mlock/hugetlb 与页面预热
java·linux·服务器·数据库·chrome·算法
菜就多练,以前是以前,现在是现在29 分钟前
Codeforces Round 1048 (Div. 2)
数据结构·c++·算法
User:你的影子31 分钟前
WPF ItemsControl 绑定
开发语言·前端·javascript
林木辛1 小时前
LeetCode 热题 160.相交链表(双指针)
算法·leetcode·链表