【Linux】快速上手Makeflie CMake

🦄个人主页:修修修也

🎏所属专栏: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.rhkb.cn/news/36839.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能蔬菜收获移动平台设计(大纲)

智能蔬菜收获移动平台设计 基于视觉识别与机械臂协同的自动化采摘系统 第一章 绪论 1.1 研究背景与意义 农业自动化需求&#xff1a; 人力成本高、采摘效率低&#xff08;尤其在温室、大棚等复杂环境&#xff09;传统机械采摘易造成蔬菜损伤&#xff0c;缺乏柔性化能力 技…

Java 实现排序算法 TopK 问题

1. 低级排序 &#xff08;1&#xff09;冒泡排序&#xff08;Bubble Sort&#xff09; 思路&#xff1a; 每次从左到右冒泡&#xff0c;把最大的数推到最后。 public class BubbleSort {public static void bubbleSort(int[] arr) {int n arr.length;for (int i 0; i <…

函数的介绍

1.函数的概念 在C语言中也有函数的概念&#xff0c;有些翻译为&#xff1a;子程序&#xff0c;这种翻译更为准确。C语言的函数就是一个完成某项特定的任务的一小段代码。这段代码是有特殊的写法和调用方法的。 C语言的程序其实是有无数个小的函数组合而成的&#xff0c;也可以…

MES汽车零部件制造生产监控看板大屏

废话不多说&#xff0c;直接上效果 预览效果请在大的显示器查看&#xff0c;笔记本可能有点变形 MES汽车零部件制造生产监控看板大屏 纯html写的项目结构如下 主要代码分享 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UT…

JS—原型与原型链:2分钟掌握原型链

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–原型三–原型链 二. 原型 什么是原型&#xff1f; 每个JavaScript对象都有一个原型&#xff0c;这个原型也是一个对象。比方说 function Person(name) {this.name name; } let person new Person(&quo…

TCP 协议

文章目录 TCP 协议简介数据包格式TCP的特性连接机制确认与重传缓冲机制全双工通信流量控制差错控制拥塞控制 端口号三次握手数据传输四次挥手抓包参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均附有参考链接&#xff0c;如侵权&#xff0c;请联系删…

二分查找的应用

什么时候用二分查找&#xff1f; 数据具有二段性的时候 第一题&#xff1a; 题解代码&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0,right nums.size()-1;while(left<right){int mid left (right-left)/2;//中…

cmake 之 CMakeLists.txt 中的函数是从哪里来的

我们都知道&#xff0c;cmake会解释执行 CMakeLists.txt 以及其他 *.cmake 脚本&#xff0c; 这里先给出一个“先验” 的知识点&#xff1a; 任何一个独立脚本或脚本函数命令的执行&#xff0c;都是通过 CPP 函数 RunListFile(...) 调用的 void cmMakefile::RunListFile(cmL…

QT 实现信号源实时采集功能支持频谱图,瀑布图显示

利用QT实现信号源实时采集功能&#xff0c;先看效果 支持双光标显示 &#xff0c;功率测量&#xff0c;带宽测量&#xff0c;载噪比测量&#xff0c;波形框选&#xff0c;水平移动等功能&#xff0c;下载链接 https://download.csdn.net/download/ZuoYueXian/90501632 实现方…

【Kafka】深入了解Kafka

集群的成员关系 Kafka使用Zookeeper维护集群的成员信息。 每一个broker都有一个唯一的标识&#xff0c;这个标识可以在配置文件中指定&#xff0c;也可以自动生成。当broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系…

神聖的綫性代數速成例題10. N維矢量綫性運算、矢量由矢量組綫性表示、N個N維矢量相關性質

N 維矢量綫性運算&#xff1a; 設&#xff0c;是維矢量&#xff0c;是數。加法&#xff1a;。數乘&#xff1a;。 矢量由矢量組綫性表示&#xff1a; 設是n維矢量&#xff0c;若存在一組數&#xff0c;使得&#xff0c;則稱矢量可由矢量組綫性表示。 N 個 N 維矢量相關性質&…

在CentOS 7.6中安装openGauss 5.1.0 (Preview)数据库并使用Navicat进行远程连接的过程记录

部署环境 华为云Flexus应用服务器 操作系统&#xff1a;CentOS 7.6 openGauss版本&#xff1a;openGauss 5.1.0 (Preview) 参考文档 官方安装文档&#xff1a; https://docs.opengauss.org/zh/docs/5.1.0/docs/InstallationGuide/%E4%BA%86%E8%A7%A3%E5%AE%89%E8%A3%85%E6%B…

SysOM 可观测体系建设(一):万字长文解读低开销、高精度性能剖析工具livetrace

可观测性是一种通过分析系统输出结果并推断和衡量系统内部状态的能力。谈及可观测性一般包含几大功能&#xff1a;监控指标、链路追踪、告警日志&#xff0c;及 Continues Profiling 持续剖析能力。对于操作系统可观测&#xff0c;监控指标可以帮助查看各个子系统&#xff08;I…

Shell脚本学习笔记:从入门到变量(一)

前言 最近在看 Shell 脚本相关的内容&#xff0c;以下是我从入门到变量部分的整理笔记&#xff0c;内容有点多&#xff0c;但都是干货。 先从基础开始&#xff0c;再逐步深入。 一、Shell 脚本入门 1. Linux 如何控制硬件&#xff1f; Linux 靠内核操作硬件&#xff08;CP…

Linux应用:进程间通信

linux的进程间通信概述 进程间通信&#xff08;IPC&#xff0c;Inter - Process Communication&#xff09;是指在不同进程之间进行数据交换和同步的机制。由于每个进程都有自己独立的地址空间&#xff0c;直接共享内存存在困难&#xff0c;因此需要专门的 IPC 机制来实现进程…

el-input 不可编辑,但是点击的时候出现弹窗/或其他操作面板,并且带可清除按钮

1.focus“getFocus”鼠标聚焦的时候写个方法&#xff0c;弹窗起来 getFocus(){ this.定义的弹窗状态字段 true;} 2.点击确定的时候&#xff0c;数值赋值到el-input的输入框,弹窗取消&#xff08;this.定义的弹段字端 false&#xff09; 3.但是会有个问题就是el-input 不可点…

Weblogic未授权远程命令执行漏洞复现

1 漏洞简介 Weblogic是Oracle公司推出的J2EE应用服务器&#xff0c;CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台&#xff0c;CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。使用这两个漏洞组成的利用链&#xff0c;可通过一个GET请求在远程W…

海康SDK协议在智联视频超融合平台中的接入方法

一. 海康SDK协议详解 海康SDK协议原理 海康SDK协议是海康威视为开发者提供的一套软件开发工具包&#xff0c;用于与海康设备&#xff08;如摄像头、NVR、DVR等&#xff09;进行通信和控制。其核心原理包括&#xff1a; 网络通信&#xff1a;基于TCP/IP协议&#xff0c;实现设…

五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 光伏功率预测&#xff01;五模型对比&#xff01;Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测(Matlab2023b 多输入单输出) 1.程序已经调试好&#xff0c;替换数据集后&#xff0c;仅运…

20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3

stty -F /dev/ttyS3 115200 -echo cat /dev/ttyS3 & echo serialdata > /dev/ttyS3 20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3 2025/3/19 14:17 缘起&#xff1a;在荣品的PRO-RK3566开发板的buildroot系统下&#xff0c;在命令…