make、makefile、cmake、nmake

  1. GCC:即GNU Compiler Collection(GNU编译器套件),可简单认为是编译器。它可以编译很多种编程语言(如C、C++、Objective-C、Fortran、Java等)。当程序只有一个源文件时,直接就可以用gcc命令编译它。

    但是若程序包含多个源文件,用gcc命令逐个去编译显然很容易混乱且工作量大,所以就出现了下面的make工具
  2. make:可以看作一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式,通过调用makefile文件中用户指定的命令来进行编译和链接
  3. makefile:make工具就像指挥家,根据makefile这个乐谱来指挥整个乐团如何演奏。即make工具根据makefile中的命令进行编译和链接,makefile命令中包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

    makefile在一些简单的工程完全可以人工拿下,但当工程非常大时,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。这时候就出现了cmake这个工具
  4. cmake:cmake就可以更加简单地生成makefile文件给上面的make用。当然cmake还有其他更加牛的功能,就是可以跨平台生成对应平台能用的makefile,我们就不用自己去修改了。
    • cmake根据什么生成makefile:cmake需要根据一个叫CMakeLists.txt的文件(学名:组态档)去生成makefile
  5. 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)
      
  6. nmake:nmake是Microsoft Visual Studio中的附带命令,需要安装VS,实际上可以说相当于linux的make
  7. 总结流程:
    • 用编辑器编写源代码,如.c文件
    • 用编译器编译代码生成目标文件,如.o
      • 如果源文件太多,一个个编译就太麻烦了。于是人们想到设计一种类似于批处理的程序,来批处理编译源文件
      • 于是就又了make工具,它是一个自动化编译工具,可以用一条命令实现完全编译
      • 但又需要编写一个规则文件,make依据它来进行批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的功能
      • 对于一个大工程,编写makefile文件也很复杂,这时人们又想到设计一个工具,可以读入所有源文件之后自动生成makefile
      • 于是就出现了cmake。cmake能输出各种各样的makefile或project文件,从而帮助程序员减轻负担。cmake中有很多设置库的,此时还不是可执行文件,make生成后才是二进制可执行文件
      • 但cmake需要依据一个规则来生成makefile,这就是cmakelists文件
    • 用链接器链接目标代码生成可执行文件,如.exe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值