- GCC:即GNU Compiler Collection(GNU编译器套件),可简单认为是编译器。它可以编译很多种编程语言(如C、C++、Objective-C、Fortran、Java等)。当程序只有一个源文件时,直接就可以用gcc命令编译它。
但是若程序包含多个源文件,用gcc命令逐个去编译显然很容易混乱且工作量大,所以就出现了下面的make工具 - make:可以看作一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式,通过调用makefile文件中用户指定的命令来进行编译和链接
- makefile:make工具就像指挥家,根据makefile这个乐谱来指挥整个乐团如何演奏。即make工具根据makefile中的命令进行编译和链接,makefile命令中包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
makefile在一些简单的工程完全可以人工拿下,但当工程非常大时,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。这时候就出现了cmake这个工具 - cmake:cmake就可以更加简单地生成makefile文件给上面的make用。当然cmake还有其他更加牛的功能,就是可以跨平台生成对应平台能用的makefile,我们就不用自己去修改了。
- cmake根据什么生成makefile:cmake需要根据一个叫CMakeLists.txt的文件(学名:组态档)去生成makefile
- CMakeLists.txt:需要自己手写
该文件是cmake构建系统的配置文件,用于定义项目的构建流程、依赖关系、编译选项等,其为cmake提供了一组指令,使其能够生成适合各种平台(如Unix、Windows)的构建文件(如Makefile、Visual Studio项目等)。主要作用如下:- 定义项目名称和版本:
project(MyProject VERSION 1.0)
- 指定所需的最低cmake版本:
cmake_minimum_required(VERSION 3.10)
- 添加源文件,(使用
add_executable()
或add_library()
)告诉cmake哪些源文件需要编译,以便生成可执行文件或库add_executable(my_executable main.cpp other.cpp) add_library(my_library mylib.cpp)
- 设置编译选项,如下:
set(CMAKE_CXX_STANDARD 11) # 使用 C++11 标准
- 查找依赖项:
find_package()
可用于寻找系统中的外部库或工具,并将这些库引入到项目中find_package(OpenCV REQUIRED) target_link_libraries(my_executable ${OpenCV_LIBS})
- 链接库:使用
target_link_libraries
命令来指定哪些库需要与可执行文件或目标链接,如下面就是创建pybind11模块(import cuda_hello
)、并将CUDA函数库链接到pybind11模块find_package(Python COMPONENTS Interpreter Development REQUIRED) // 查找python解释器和开发组件 find_package(pybind11 CONFIG REQUIRED) // 查找pybind11包 add_library(cuda_functions SHARED src/cuda_hello.cu) // 添加CUDA文件并创建共享库 // target_link_libraries(my_executable my_library) pybind11_add_module(cuda_hello src/pybind_wrapper.cpp) // 创建pybind11模块 target_link_libraries(cuda_hello PRIVATE cuda_functions) // 将CUDA函数库链接到pybind11模块
- 条件编译:cmake可通过
if()
、elseif()
、endif()
等条件控制指令,来根据系统的不同设置来调整构建过程if(CMAKE_SYSTEM_NAME STREQUAL "Windows") # Windows-specific configuration elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") # Linux-specific configuration endif()
- 安装规则和生成测试:使用
install()
命令定义如何安装生成的可执行文件、库或其他资源文件;使用enable_testing()
和add_test()
配置项目的测试用例,使项目的构建过程可以包含自动化测试install(TARGETS my_executable DESTINATION bin) enable_testing() add_test(NAME my_test COMMAND my_executable)
- 定义项目名称和版本:
- nmake:nmake是Microsoft Visual Studio中的附带命令,需要安装VS,实际上可以说相当于linux的make
- 总结流程:
- 用编辑器编写源代码,如.c文件
- 用编译器编译代码生成目标文件,如.o
- 如果源文件太多,一个个编译就太麻烦了。于是人们想到设计一种类似于批处理的程序,来批处理编译源文件
- 于是就又了make工具,它是一个自动化编译工具,可以用一条命令实现完全编译
- 但又需要编写一个规则文件,make依据它来进行批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的功能
- 对于一个大工程,编写makefile文件也很复杂,这时人们又想到设计一个工具,可以读入所有源文件之后自动生成makefile
- 于是就出现了cmake。cmake能输出各种各样的makefile或project文件,从而帮助程序员减轻负担。cmake中有很多设置库的,此时还不是可执行文件,make生成后才是二进制可执行文件
- 但cmake需要依据一个规则来生成makefile,这就是cmakelists文件
- 用链接器链接目标代码生成可执行文件,如.exe
make、makefile、cmake、nmake
于 2024-05-07 11:07:59 首次发布