make学习

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

作者:Hang Shao

出处:https://www.cnblogs.com/pam-sh/p/16986168.html

版权:本作品采用「知识共享」许可协议进行许可。

声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.

posted @   PamShao  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu