【Linux】快速上手Makeflie CMake

news/2025/3/28 15:12:08/

🦄个人主页:修修修也

🎏所属专栏:Linux

⚙️操作环境:Xshell (操作系统:Ubuntu 22.04 server 64bit)


目录

快速上手Makefile

基本结构

变量

自动变量

常用目标

快速上手CMake

CMake与Makefile的关系

CMake的使用步骤

常用命令

(1) 基本配置

(2) 变量与选项

(3) 查找依赖

高级功能

(1) 多目录项目

(2) 安装与打包

(3) 测试支持

常用工具

结语


快速上手Makefile

        Makefile 是一种用于自动化编译和构建程序的工具,尤其在 C/C++ 项目中广泛使用。它通过定义规则(rules)来指定如何从源代码生成目标文件可执行文件


基本结构

        Makefile的核心格式为:

目标(target):依赖(dependencies)命令(command)
  • 目标(target): 通常是生成的文件名(如main.o或main)。
  • 依赖(dependencies): 生成目标所需的文件(如main.c或main.o文件)。
  • 命令(command): 生成目标的Shell命令(以Tab开头)。

        在目录中创建makefile文件,示例如下:

hello:hello.cgcc hello.c -o hello

        此时我们目录中有.c文件hello.c:

        此时我们可以直接输入make命令,使.c文件自动编译,效果如下:

        如果有还不太了解gcc/g++编译器编译命令的可以先移步:【Linux】手把手教你从零上手gcc/g++编译器


变量

        变量可以简化重复内容(如编译器, 编译选项), 如:

CC = gcc
CFLAGS = -Wallhello:hello.c$(CC) $(CFLAGS) hello.c -o hello

        运行展示如下:


自动变量

  • $@当前目标名(如 app)。

  • $^所有依赖(如 main.c utils.c)。

  • $<第一个依赖(如 main.c)。

        示例如下:

hello:hello.cgcc $^ -o $@

        运行结果如下:


常用目标

  • all: 默认目标,通常编译所有内容
  • clean: 清理生成的文件
  • .PHONY: 声明伪目标(不生成文件)

        假设现在有两个程序一个服务器程序一个客户端程序需要一起编译生成并需要及时清理,那么makefile文件的编写参考:

.PHONY:all
all:server clientserver:Server.ccg++ -o $@ $^ -std=c++11
client:Client.ccg++ -o $@ $^ -lpthread -std=c++11.PHONY:clean
clean:rm -f server client

        更多Makefile相关内容可以查阅官方手册:GNU Make 官方文档


快速上手CMake

        CMake 是一个跨平台的自动化构建工具,用于管理代码的编译、链接和安装流程。它通过生成标准的构建文件(如 Makefile、Visual Studio 项目、Ninja 文件等),简化了跨平台项目的构建过程。

CMake与Makefile的关系

  • Makefile:需要手动编写规则,直接调用编译器。

  • CMake:通过高级的配置文件 CMakeLists.txt 生成 Makefile(或其他构建系统文件),无需手动处理底层编译细节。

  • 优势

    • 跨平台(Windows、Linux、macOS 等)。

    • 支持复杂的项目结构(多目录、多库)。

    • 自动管理依赖关系(如头文件、第三方库)。

CMake的使用步骤

1.编写CMakeLists.txt文件

        每个项目目录都需要一个 CMakeLists.txt,定义构建规则。

        示例如下:

cmake_minimum_required(VERSION 3.15)  //最低CMake版本(不能比当前机器CMake版本高)
project(test)                         //项目名称
add_executable(hello hello.c)         //生成可执行文件(参数是其依赖关系)

2.执行cmake命令生成makefile文件:

3.执行make命令生成可执行程序:

        可以看到,我们直接执行cmake命令会生成大量的与程序本身无关的杂乱文件,这会干扰我们操作,所以我们可以通过以下步骤生成一下构建系统避免污染源代码:

1.创建构建目录(推荐 build 目录,避免污染源码):

mkdir build && cd build

2.运行cmake生成构建文件:

camke .. // 根据上级目录的 CMakeLists.txt 生成 Makefile

3.调用构建工具(如make或ninja)编译:

make #执行生成的Makefile

        运行效果如下:


常用命令

(1) 基本配置
  • project(<PROJECT_NAME>): 定义项目名称和支持的语言(如 CXX 表示 C++)。

  • add_executable(<target> <source_files>): 生成可执行文件。

  • add_library(<target> <source_files>): 生成静态库(.a/.lib)或动态库(.so/.dll)。

  • target_link_libraries(<target> <libraries>): 链接库到目标(可执行文件或库)。

(2) 变量与选项
  • 定义变量:

    set(SRC_FILES main.cpp utils.cpp)
    add_executable(my_app ${SRC_FILES})
  • 条件判断:

    if(WIN32)# Windows 平台特定配置
    endif()
(3) 查找依赖
  • 查找系统已安装的库:

    find_package(OpenCV REQUIRED)
    target_link_libraries(my_app ${OpenCV_LIBS})
  • 自定义库路径:

    set(OPENCV_DIR "/path/to/opencv")
    find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR})

高级功能

(1) 多目录项目
  • 主目录的 CMakeLists.txt

    add_subdirectory(src)    # 进入子目录 src
    add_subdirectory(libs)   # 进入子目录 libs
  • 子目录的 CMakeLists.txt 定义各自的构建规则。

(2) 安装与打包
  • 定义安装规则:

    install(TARGETS my_app DESTINATION bin)  # 安装可执行文件到 bin 目录
    install(FILES include/utils.h DESTINATION include) # 安装头文件
  • 生成安装包:

    include(InstallRequiredSystemLibraries)
    set(CPACK_PACKAGE_NAME "MyApp")
    include(CPack)
(3) 测试支持
  • 启用测试:

    enable_testing()
    add_test(NAME my_test COMMAND my_app --test)

常用工具

  • ccmake:命令行交互界面,调整 CMake 变量。

  • cmake-gui:图形化界面,配置项目选项。

  • CTest:运行测试套件。

  • CPack:生成安装包(如 .deb.zip)。


结语

希望这篇关于 快速上手Makefile & CMake 的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【Linux】手把手教你从零上手Vim编辑器

【Linux】手把手教你从零上手gcc/g++编译器

【Linux】实现一个简易的shell命令行

【Linux】基本指令(下)

【Linux】基本指令(中)

【Linux】基本指令(上)



http://www.ppmy.cn/news/1580862.html

相关文章

什么是CDN、PCDN?

一、CDN&#xff08;内容分发网络&#xff09; 1.1 技术定义与演进 CDN&#xff08;Content Delivery Network&#xff09;诞生于20世纪90年代&#xff0c;最初用于解决互联网拥塞问题。现代CDN已发展为包含 边缘计算、安全防护、动态加速 的综合性服务网络&#xff0c;全球市…

笔记本运行边缘计算

笔记本电脑可以用来运行PCDN&#xff08;Peer-to-Peer Content Delivery Network&#xff09;服务。实际上&#xff0c;如果你有闲置的笔记本电脑&#xff0c;并且它具备一定的硬件条件和网络环境&#xff0c;那么它可以成为一个不错的PCDN节点。 运行PCDN的基本要求 硬件需求…

精挑20题:MySQL 8.0高频面试题深度解析——掌握核心知识点、新特性和优化技巧

1. MySQL 8.0 中&#xff0c;为什么查询缓存被移除&#xff1f; 答案&#xff1a; 原因&#xff1a;查询缓存对频繁更新的表效果差&#xff0c;任何对该表的写操作都会清空所有相关缓存&#xff0c;导致缓存命中率低&#xff0c;反而增加开销。 替代方案&#xff1a; 使用应用…

基于FPGA的DDS连续FFT 仿真验证

基于FPGA的 DDS连续FFT 仿真验证 1 摘要 本文聚焦 AMD LogiCORE IP Fast Fourier Transform (FFT) 核心,深入剖析其在 FPGA 设计中的应用。该 FFT 核心基于 Cooley - Tukey 算法,具备丰富特性,如支持多种数据精度、算术类型及灵活的运行时配置。文中详细介绍了其架构选项、…

云原生分布式存储:数据洪流中的时空折叠艺术

引言&#xff1a;数据维度战争的新防线 蚂蚁集团存储集群达500EB规模&#xff0c;Netflix每日处理3PB视频数据。AWS S3支持每秒1.5亿次请求&#xff0c;字节跳动对象存储延迟低至12ms。IDC预测2026年全球存储开销达亿&#xff0c;沃尔玛每秒处理万笔交易日志&#xff0c;沙特阿…

使用LLaMA Factory微调导出模型,并用ollama运行,用open webui使用该模型

本篇记录学习使用llama factory微调模型的过程&#xff0c;使用ollama运行微调好的模型&#xff0c;使用open webui前端调用ollama的模型&#xff1b; 测试机信息&#xff1a; 系统&#xff1a;Ubuntu 24.04.2 LTS&#xff08;桌面版&#xff09; cpu&#xff1a;i9-14900KF …

超硬核区块链算法仿真:联盟链PBFT多线程仿真实现 :c语言完全详解版

1 22年年底想用gpt做出一个pbft的算法仿真&#xff0c;到了25年终于可以结合gpt grok perplexcity deepseek等实现了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; #include <stdio.h> #include <stdlib.h> #include <windows.h> #inclu…

【Dive Into Stable Diffusion v3.5】1:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练

目录 1 引言2 项目简介3 快速上手3.1 下载代码3.2 环境配置3.3 项目结构3.4 下载模型与数据集3.5 运行指令3.6 核心参数说明3.6.1 通用参数3.6.2 优化器/学习率3.6.3 数据相关 4 结语 1 引言 在人工智能和机器学习领域&#xff0c;生成模型的应用越来越广泛。Stable Diffusion…