make学习

make,学习 · 浏览次数 : 44

小编点评

**Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码** **VERSION 1** ```makefile hello: main.cpp printhello.cpp factorial.cpp g++ -o hello main.cpp printhello.cpp factorial.cpp version1: hello main.cpp printhello.cpp factorial.cpp: main.cpp printhello.cpp factorial.cpp clean: rm -f hello main.cpp printhello.cpp factorial.cpp ``` **VERSION 2** ```makefile CXX = g++ TARGET = helloOBJ = main.o printhello.o factorial.o $(TARGET): $(OBJ) $(CXX) -o $@ $^%.o: %.cpp clean: rm -f $(TARGET) $(OBJ) ``` **VERSION 3** ```makefile CXX = g++ TARGET = helloSRC = $(wildcard *.cpp)OBJ = $(patsubst %.cpp, %.o, $(SRC)) $(CXXFLAGS) = -c -Wall$(TARGET): $(OBJ)\t$(CXX) -o $@ $^%.o: %.cpp\t$(CXX) $(CXXFLAGS) $< -o $@.PHONY: cleanclean:\trm -f *.o $(TARGET) clean: rm -f $(TARGET) $(OBJ) ``` **VERSION 4** ```makefile CXX = g++ TARGET = helloSRC = $(wildcard *.cpp)OBJ = $(patsubst %.cpp, %.o, $(SRC)) $(CXXFLAGS) = -c -Wall$(TARGET): $(OBJ)\t$(CXX) -o $@ $^%.o: %.cpp\t$(CXX) $(CXXFLAGS) $< -o $@.PHONY: cleanclean:\trm -f *.o $(TARGET) clean: rm -f $(TARGET) $(OBJ) ```

正文

make学习,参考「Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码

程序见:https://github.com/ShiqiYu/CPP/tree/main/week03/examples/lab

文件结构

image-20221215214542623

make语法

  • g++
#「只编译不链接」编译.cpp文件,得到.o文件
g++ -c *.cpp
  
#链接,将.o文件链接到一起,得到可执行文件 
g++ *.o file
  
# 显示编译时的warning
g++ -c -Wall *.cpp

版本1

## VERSION 1
hello: main.cpp printhello.cpp  factorial.cpp
	g++ -o hello main.cpp printhello.cpp  factorial.cpp
  • 目标(hello)依赖于后面的.cpp文件(main.cpp printhello.cpp factorial.cpp)
  • 通过第二句生成这个目标(hello)

版本2

## VERSION 2
# 变量定义
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o

# 「链接」.o文件
$(TARGET): $(OBJ)
	$(CXX) -o $(TARGET) $(OBJ)

# 「编译」生成.o
main.o: main.cpp
	$(CXX) -c main.cpp

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

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

版本3

## VERSION 3
# 变量定义
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o

# 编译时显示warning
CXXFLAGS = -c -Wall

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

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

.PHONY: clean
clean:
	rm -f *.o $(TARGET)
  • $@)表示($(TARGET)
  • $^)表示($(TARGET))的所有依赖,即($(OBJ)
  • $<)表示($(TARGET))的第一个依赖,即(%.cpp
  • 通配符\(\%\)表示匹配所有类型的文件
  • (.PHONY: clean)解决项目中出现clean文件而make clean失效的问题,因为项目中永远没有(.PHONY),所有不会失效,而(.PHONY)依赖于clean,所以make clean必执行

版本4

## VERSION 4
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)
  • 将当前目录下的所有(*.cpp)文件都放在(SRC)变量里
    • 「wildcard」是一个扩展通配符,常用使用:$(wildcard PATTERN...),在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表
    • 这里的$(wildcard *.cpp)表示获取工作目录下的所有.cpp文件列表
  • 将(SRC)目录下的所有.cpp文件替换成.o文件
    • 「patsubst」也是一个扩展通配符,语法:$(patsubst %.c,%.o,$(wildcard *.c)),表示替换
  • 更多参考:https://blog.csdn.net/m0_46535940/article/details/125086502

参考

1、http://www.freecplus.net/b7a1c199959f4349b2a98874864a2000.html

与make学习相似的内容:

make学习

make学习,参考「Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码」 程序见:https://github.com/ShiqiYu/CPP/tree/main/week03/examples/lab 文件结构 make语法 g++ #「只编译不链接」编译.

准备学习 make

make -h用法:make [选项] [目标] ...选项: -b, -m 为兼容性而忽略。 -B, --always-make 无条件制作 (make) 所有目标。 -C 目录, --directory=目录 在执行前先切换到 <目录>。 -d 打印大量调试信息。 --debug[=旗标] 打印

ContextSwitch 学习与使用

ContextSwitch 学习与使用 说明 github上面有一个简单的测试系统调用以及上下文切换的工具. contextswitch. 下载之后直接make就可以进行简单的测试 需要注意的是 部分arm环境没有: -mno-avx 这个参数, 需要去掉一下. 官方文档以及说明 Little mi

Stream的简单学习

Stream的简单学习 前言 https://github.com/jeffhammond/STREAM unzip STREAM-master.zip cd /STREAM-master/ make 就可以编译完成 含义 STREAM 是业界广为流行的综合性内存带宽实际性能 测量 工具之一。 随着

bazel学习

bazel学习 a fast, scalable, multi-language and extensible build system bazel就是一个编译打包工具,类似于make、cmake等 安装 ⚠️:Centos7系统安装bazel4 参考:https://docs.bazel.buil

memtester 以及 mlc 简单学习

memtester 以及 mlc 简单学习 下载 memtester https://pyropus.ca./software/memtester/ 下载好后直接进行 make 和make install 就可以了. Intel MLC Intel® Memory Latency Checker 下

Stress-ng 的简单学习

背景 想研究一下国产和不同架构,不通型号CPU的算力 也作为后续生产交付的基线准备. 学习各种不同工具进行简要测试. 安装 git clone https://github.com/ColinIanKing/stress-ng.git cd stress-ng make 然后就会在当前目录创建一个可

使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例

## 译者注 本文是一篇不可多得的好文,MemoryPack 的作者 neuecc 大佬通过本文解释了他是如何将序列化程序性能提升到极致的;其中从很多方面(可变长度、字符串、集合等)解释了一些性能优化的技巧,值得每一个开发人员学习,特别是框架的开发人员的学习,一定能让大家获益匪浅。 ## 简介 我发

[转帖]计算机体系结构-(4)内存系统的问题解决方向

https://zhuanlan.zhihu.com/p/436875536 本人lino,即将毕业的研究生,在此记录下学习过程。本次记录跟随是苏黎世邦理工大学的计算机体系结构课程。 本文将介绍一些宽泛的Memory的解决方案。首先是Make memory and controllers more

[转帖]linux系统make命令详解

https://www.jianshu.com/p/9a3fc3edb18c 姓名:曾国强 学号:19021210984 转载自https://blog.csdn.net/ididcan/article/details/6193199 【嵌牛导读】make是linux和unix系统常用的编译命令。m