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
<think>我们正在解决Tongsuo在Windows下使用nmake编译时因缺少Makefile而失败的问题。根据用户提供的引用,我们知道nmake是Windows下的make工具,它需要Makefilemakefile文件作为输入。通常,开源项目如Tongsuo(原BabaSSL)在Windows上构建时,通常需要使用Perl脚本生成Makefile,而不是直接提供。原因分析:1.Tongsuo项目通常使用autotools(在Unix-like系统上)或CMake来生成Makefile,但Windows上通常使用Perl配置生成NMake可用的Makefile。2.在Windows上,Tongsuo的构建流程一般是:perlConfigureVC-WIN32#或其他目标平台nmake因此,缺少Makefile的原因可能是没有运行配置脚本(如Configure)来生成Makefile。解决方案步骤:1.确认当前目录:在Tongsuo源码目录下进行操作。2.运行配置脚本:使用Perl运行Configure脚本,并指定目标平台(例如VC-WIN32、VC-WIN64A等)。例如,对于32位:perlConfigureVC-WIN32对于64位:perlConfigureVC-WIN64A注意:如果构建国密(GMTLS)支持,可能需要添加额外的选项,例如:perlConfigureenable-ntlsVC-WIN64A3.生成Makefile:运行上述命令后,Configure脚本会生成一个Makefile(或Makefile文件)供nmake使用。4.使用nmake编译:运行nmake命令进行编译。如果仍然失败,可以检查:-是否安装了VisualStudio并配置了环境(vcvarsall.bat)?-PerlNASM的路径是否在系统PATH中?示例步骤(在VisualStudio的命令行工具中执行):cdpath\to\tongsuo-sourceperlConfigureVC-WIN64Aenable-ntlsnmake引用说明:用户提供的引用[1]介绍了makefile的基本知识,而引用[2]则提到了Windows下的nmake命令。这些引用提醒我们,在Windows下构建项目时,我们需要为nmake准备好合适的Makefile文件。因此,关键步骤是通过运行Configure脚本来生成Makefile。注意:在Windows环境下,我们通常使用“VisualStudio命令提示”来提供编译环境。如果用户已经运行了Configure但仍然没有生成Makefile,则可能是Configure过程中出现了错误。需要检查Configure的输出信息。相关问题:1.如何在Windows上为Tongsuo启用国密算法支持?2.如何用CMake构建Tongsuo?3.如何解决Tongsuo在配置时出现的Perl脚本错误?</think> ### 解决 Tongsuo 编译缺少 Makefile 的完整方案 Tongsuo 在 Windows 使用 NMake 编译时缺少 Makefile 的根本原因在于未正确生成构建文件。以下是完整的解决流程: --- #### 📌 步骤 1:验证构建环境依赖 执行前确保已安装: 1. **Visual Studio 构建工具**(含 NMake) 2. **Perl**(建议 Strawberry Perl) 3. **NASM**(最新版) 4. **CMake**(>=3.12) ```powershell # 验证工具安装 nmake /? # 检查 NMake perl -v # 检查 Perl nasm -v # 检查 NASM cmake --version # 检查 CMake ``` --- #### 🛠 步骤 2:生成 Makefile Tongsuo 使用 CMake 生成 NMake 兼容的构建文件: ```powershell cd path\to\tongsuo # 创建构建目录并生成 Makefile mkdir build & cd build cmake -G "NMake Makefiles" .. -DENABLE_NTLS=ON -DENABLE_SM2=ON # 输出应包含 -- Generating NMake makefiles -- Configuring done -- Generating done ``` > 关键参数说明: > `-G "NMake Makefiles"` : 指定生成 NMake 格式[^2] > `-D` 开头的参数:启用国密特性(根据需求调整) --- #### ⚡ 步骤 3:执行 NMake 编译 在生成的构建目录执行: ```powershell cd build nmake # 开始编译过程 # 成功输出示例 [ 85%] Built target tongsuo_ssl [100%] Linking C executable apps/openssl.exe [100%] Built target openssl ``` --- #### 🔍 故障排查表 | 错误现象 | 解决方案 | |----------|----------| | `CMake Error: Could not create named generator NMake Makefiles` | 安装 CMake 时勾选 *"Add to system PATH"* | | `NASM not found` | 添加 NASM 到 PATH:`set PATH=C:\nasm;%PATH%` | | `perl: command not found` | 使用 Strawberry Perl 并重启终端 | | 编译时链接错误 | 运行 `cmake .. -DENABLE_SHARED=OFF` 禁用动态库 | --- ### 核心原理说明 1. **CMake 生成器** Tongsuo 使用 CMake 作为元构建系统,`-G "NMake Makefiles"` 生成符合 NMake 语法的 Makefile[^1] $$ \text{CMakeLists.txt} \xrightarrow{\text{cmake -G}} \text{MakefileNMake格式)} $$ 2. **编译流程差异** 与传统 make 不同,NMake 需要特定格式的 Makefile: ```makefile # 合法 NMake 语法示例 all: $(BIN)\openssl.exe $(BIN)\openssl.exe: $(OBJS) link /out:$@ $^ ``` 避免使用 Unix 特有的命令(如 `rm`、`cp`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值