前言
g++:c++编译器
make:批处理工具,通过makefile文件实现批处理,本质还是g++编译器进行编译
cmake:跨平台编译工具,通过CMakeLists.txt文件实现自动编译,本质还是转成makefile实现批处理
项目源码在上上一篇文章:
https://editor.csdn.net/md/?articleId=124302251
代码实例
这个例子比较简单,主要为了说明这三个工具的使用。
项目目录结构
g++方式
# 在项目根目录下执行
g++ -std=c++11 ./src/*.cpp -o ./bin/process01 -I ./include/ -L ../bin/
缺点:源代码多时,用gcc逐个去编译,工作量大、容易混乱,且不能实现自动编译
因此,产生了make方式。
make方式
在项目src目录下,创建makefile文件,文件内容如下:
TARGET=process
LIBS=-lpthread
OBJS=ProcessInfo.o main.o
CXXFLAGS=-I ../include/
LDFLAGS=-L ../bin/
OUTPUT_DIR=../bin
$(TARGET):*.cpp
$(CXX) -std=c++11 $^ -o $(OUTPUT_DIR)/$@ $(LIBS) $(CXXFLAGS)
@echo "$(TARGET) build success!"
clean:
$(RM) $(OBJS) $(TARGET)
执行:
make
结果:
缺点:不可跨平台,且当工程非常大的时候,手写makefile也非常麻烦
所以,产生了cmake方式,也是我推荐和喜欢的方式
cmake方式
在项目根目录下创建CMakeLists.txt文件,内容如下:
# 设置CMake最小版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 3.21)
# 设置项目名称
PROJECT(processInfo)
# 查找项目src目录下的所有源文件,并将名称保存到 DIR_SRCS变量
aux_source_directory(${PROJECT_SOURCE_DIR}/src DIR_SRCS)
# 设置包含的头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 设置文件输出路径为工程目录下的bin文件下
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 指定生成目标
ADD_EXECUTABLE(processInfo ${DIR_SRCS})
执行(外部构建):
# 在当前目录下创建build目录
mkdir build
# 进入build 目录
cd build
# 编译上级的CMakeLists.txt,生成makefile
cmake ..
# 执行make命令,生成目标
make
结果:
[root@localhost ProcessInfo]# tree
.
├── bin
│ └── processInfo
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.21.4
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ ├── CMakeCCompilerId.c
│ │ │ │ └── tmp
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ ├── CMakeCXXCompilerId.cpp
│ │ │ └── tmp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.cxx
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── processInfo.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── compiler_depend.make
│ │ │ ├── compiler_depend.ts
│ │ │ ├── DependInfo.cmake
│ │ │ ├── depend.make
│ │ │ ├── flags.make
│ │ │ ├── link.txt
│ │ │ ├── progress.make
│ │ │ └── src
│ │ │ ├── Main.cpp.o
│ │ │ ├── Main.cpp.o.d
│ │ │ ├── ProcessInfo.cpp.o
│ │ │ └── ProcessInfo.cpp.o.d
│ │ ├── progress.marks
│ │ └── TargetDirectories.txt
│ ├── cmake_install.cmake
│ └── Makefile
├── CMakeLists.txt
├── include
│ └── ProcessInfo.h
├── makefile
└── src
├── Main.cpp
└── ProcessInfo.cpp
13 directories, 40 files
问题
在使用cmake时,根据错误提示,找对应问题,如下例子:
根据提示,去对应行找出出错问题,如果一眼看不出来问题,可以尝试注释掉对应行内容,看是否还报错,从而确定是否是对应行错误,然后,具体排查报错原因,一般是语法错误或空格导致。
总结
在实际的项目中,推荐使用cmake方式进行项目构建,简单、跨平台。并且,采用cmake的外部构建方式,这样产生的构建文件不会污染项目结构。