参考
vscode 进阶
https://blog.csdn.net/weixin_41858148/article/details/125550122
概念
- make工具
用于复杂项目多文件编译,相当于一个智能的批处理工具,本身没有编译和连接的功能,而是用类似于批处理的方式通过调用makefile文件中用户指定的命令来编译和连接
- Makefile
Makfile文件中 包含了调用gcc/g++编译某个文件的命令
- CMake
Makefile可以手写,也可以利用CMake工具根据CMakeLists.txt生成Makefile,然后再通过Make工具进行编译和连接
- CMakeLists/Makefile
手写CMakeLists.txt文件,CMake根据CMakeLists.txt生成Makefile文件,然后编译工程
问题解决
vscode 使用原生make命令
https://blog.csdn.net/NiceToMeetUToo/article/details/101226888
- 进入MinGW\bin,把mingw32-make.exe改名为make.exe
- 不重命名,则在终端使用 mingw32-make 命令
makefile编写
## version1
# 源文件多的情况下,编写复杂
hello: main.cpp funcs.cpp # 生成一个hello目标 这个目标依赖于main.cpp funcs.cpp这些文件
g++ -o hello main.cpp funcs.cpp
## version2
CXX=g++ # 指定编译器
TARGET=hello2 # 指定生成的目标文件
OBJ=main.o funcs.o # 单个文件的编译文件
$(TARGET): $(OBJ) # TARGET文件依赖于OBJ文件 # 如果修改了文件,则使用下面命令进行重新编译 相当于变量替换
$(CXX) -o $(TARGET) $(OBJ)
main.o: main.cpp # 定义依赖关系
$(CXX) -c main.cpp
funcs.o: funcs.cpp
$(CXX) -c funcs.cpp
## version3
CXX=g++ # 指定编译器
TARGET=hello3 # 指定生成的目标文件
OBJ=main.o funcs.o # 单个文件的编译文件
CXXFLAGS=-c -Wall # -Wall 输出所有等级的警告 而CXXFLAGS=-c则值报告错误等级
$(TARGET): $(OBJ) # TARGET文件依赖于OBJ文件 # 如果修改了文件,则使用下面命令进行重新编译 相当于变量替换 $@等价于$(TARGET) $^等价于$(OBJ)
$(CXX) -o $@ $^
%.o: %.cpp # $< ??? 什么作用
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean: # make clean 命令则执行下面的语句
rm -f *.o $(TARGET)
## version4
CXX=g++ # 指定编译器
TARGET=hello4 # 指定生成的目标文件
SRC=$(wildcard *.cpp) # 源文件是所有的.cpp文件
OBJ=$(patsubst %.cpp,%.o,$(SRC)) # 将源文件替换为.o文件 作为每个目标文件
CXXFLAGS=-c -Wall # -Wall 输出所有等级的警告 而CXXFLAGS=-c则值报告错误等级
$(TARGET): $(OBJ) # TARGET文件依赖于OBJ文件 # 如果修改了文件,则使用下面命令进行重新编译 相当于变量替换 $@等价于$(TARGET) $^等价于$(OBJ)
$(CXX) -o $@ $^
%.o: %.cpp # $< ??? 什么作用
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean: # make clean 命令则执行下面的语句
rm -f *.o $(TARGET)
编译
仅用makfile的编译步骤
> make .
cmakelists.txt编写
cmake_minimum_required(VERSION 3.10)
project(hello7)
add_executable(hello7 main.cpp funcs.cpp)
编译
cmake+makfile的编译步骤
> cmake -B ./build -G "MinGW Makefiles"
> cd ./build # 出现了makefile 还有可能出现.exe 如果没有出现则还要make一下
> make .
> ./main.exe