【cmake学习】搭建一个简单的cmake工程(初级版)

news2025/1/22 19:09:55

         目录

1、工程框架介绍

2、编写CMakeLists.txt

(1) 限制cmake最低版本、工程命名

(2) 引入头文件目录

(3) 引入库目录(可选)

(4) 引入源文件

(5) 生成可执行文件 / 生成动静态库 

(6) 链接库文件(可选)

3、完整CMakeLists.txt


1、工程框架介绍

cmake搭建需要关注的是工程的整体架构,其实就是把你需要用到的文件都交给cmake管理。编译的时候,你的程序需要什么,cmake就给什么;如果没有程序要求的东西,cmake就会报错。

2、编写CMakeLists.txt

(1) 限制cmake最低版本、工程命名

# 限制 cmake 最低版本为 3.0
cmake_minimum_required(VERSION 3.0)

# 为当前工程命名
project(tool_test)
  • PROJECT_NAME:cmake预置变量,代表当前工程的名字,即 tool_test

(2) 引入头文件目录

其实就是将我们项目里用到的所有头文件都交给 cmake 管理,在上面的工程里,vac/tool、vac/util 以及 app1 目录下都有头文件,所以我们要告诉 cmake 这些目录下有头文件。

include_directories(${PROJECT_SOURCE_DIR}/app1)
include_directories(${PROJECT_SOURCE_DIR}/vac/tool)
include_directories(${PROJECT_SOURCE_DIR}/3rd-part/include)
  • PROJECT_SOURCE_DIR:cmake预置变量,代表顶层CMakeLists.txt 文件所在路径

(3) 引入库目录(可选)—— 对应下面的链接库文件

如果当前项目需要使用开源的第三方库 或者 自己定义的第三方库,那就需要让cmake知道这个库在哪,否则在使用库文件中的某个函数时,会报 undefined_reference 的错误,其实就是没有找到对应的函数定义。

这里就以自己定义的第三方库为例。(一般提供第三方库至少需要提供两个内容,一个是头文件,告诉别人有哪些函数可以使用;一个是 .so 或者 .a 文件,即函数定义)

link_directories(${PROJECT_SOURCE_DIR}/3rd-part/lib)

(4) 引入源文件

头文件表示有哪些函数可供你使用,源文件就代表这些函数的具体实现 或者 main函数所在文件。因为程序在链接阶段,会根据符号表去找对应的函数定义,如果没找到函数定义,就会报 undefined_reference 的错误。

############################################################
#
# file(GLOB <variable_name> ... ) 表示将列举的内容添加到变量中 
#
############################################################
file(GLOB ALL_SOURCES 
    ${PROJECT_SOURCE_DIR}/app1/*.cpp 
    ${PROJECT_SOURCE_DIR}/vac/tool/*.cpp
)

(5) 生成可执行文件 / 生成动静态库 

# 生成名为 ${PROJECT_NAME} 的可执行文件,该可执行文件的生成依赖的源文件是 ${ALL_SOURCES}
add_executable(${PROJECT_NAME} ${ALL_SOURCES})

(6) 链接库文件(可选)

如果生成可执行文件时,需要用到第三方库的内容,而且前面已经添加了第三方库的搜索路径,那么我们可以让当前可执行文件(目标文件)与库文件建立连接。

######################################################
#
# target_link_libraries(<target_name> <library_name>)
#
######################################################
target_link_libraries(${PROJECT_NAME} test)

注意:链接库文件时,需要去掉前缀和后缀。

3、完整CMakeLists.txt

# 限制 cmake 最低版本为 3.0
cmake_minimum_required(VERSION 3.0)

# 为当前工程命名
project(tool_test)

# 引入头文件目录
include_directories(${PROJECT_SOURCE_DIR}/app1)
include_directories(${PROJECT_SOURCE_DIR}/vac/tool)
include_directories(${PROJECT_SOURCE_DIR}/3rd-part/include)

# 引入库文件搜索路径(可选)
link_directories(${PROJECT_SOURCE_DIR}/3rd-part/lib)

# 引入源文件
file(GLOB ALL_SOURCES 
    ${PROJECT_SOURCE_DIR}/app1/*.cpp 
    ${PROJECT_SOURCE_DIR}/vac/tool/*.cpp
)

# 生成可执行文件
add_executable(${PROJECT_NAME} ${ALL_SOURCES})

# 链接库文件
target_link_libraries(${PROJECT_NAME} test)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uefi 内存管理

PEI 阶段 PEI 阶段最为重要的结构是HOB, 初始化内存服务前&#xff0c;PEI 申请的内存其实是插入到FV 文件 也就是FLASH 里面去运行。 在此状态下&#xff0c;FLASH 可读不可写&#xff0c;所以是不能使用全局变量的。如果有需要模块间共享信息&#xff0c;需要申请HOB. HO…

gtkmm给组件添加css

设置方式 使用CSS分为两步&#xff0c;1:为组件设这css名称&#xff0c;2:加载样式表。 样式表我们写在文件中就行&#xff08;似乎也可以从字符串加载&#xff0c;不过不推荐&#xff09;。 1. 设置css名称 使用gtk的接口&#xff1a;gtk_widget_class_set_css_name()。 这…

rk3568点亮E-ink

rk3568 Android11/12 适配 E-ink “EINK”是英语ElectronicInk的缩写。翻译成中文为“电子墨水”。电子墨水由数百万个微胶囊(Microcapsules)所构成&#xff0c;微胶囊的大小约等同于人类头发的直径。每个微胶囊里含有电泳粒子──带负电荷的白色以及带正电荷的黑色粒子&#…

Ubuntu 交叉编译Windows 版本的ffmpeg最佳实践

之前介绍在Windows上采用msys2+minGW或者cygwin在Windows编译方法。很多读者觉得在Windows搭建一个类Linux比较麻烦或者说方法不够通用,本文就介绍在流行的Linux发行版Ubuntu上编译window版本的ffmpeg。即介绍一种通用办法来编译Windows版本ffmpeg,该方法可以推广到android,…

算法 贪心4 || 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

860.柠檬水找零 很简单的一题&#xff0c;完全是常识题 class Solution { public:bool lemonadeChange(vector<int>& bills) {unordered_map<int,int> map;for(int i 0; i < bills.size(); i){map[bills[i]];if(bills[i] ! 5){if(map[5] 0) return fals…

【Linux】程序中获取和设置cpu和mem相关信息

这里是目录一、CPU和MEM信息1.1、CPU信息1.1.1、CPU核心数1.1.2、CPU频率读取和调整1.1.3、CPU温度1.2、MEM信息二、C程序读取CPU和MEM信息三、测试写在前面&#xff1a; 记录一下日常&#xff0c;之前有做过相关工作&#xff0c;但是没有记录下来&#xff0c;因此写一写文章。…

使用hbuilder连接夜神模拟器调试app

1. Hbuilder设置 这里端口号随便用一个没有被占用的&#xff1b; 路径夜神模拟器的安装路径下的nox_adb.exe的路径。 2. 夜神模拟器设置 设置如下&#xff1a; 工具&#xff0c;设置&#xff0c;关于平板电脑&#xff08;这里应该没有开发者模式选项&#xff0c;这是我配好之…

【LeetCode】剑指 Offer 53. 在排序数组中查找数字 p263 -- Java Version

1. 题目介绍&#xff08;53. 在排序数组中查找数字&#xff09; 面试题53&#xff1a;在排序数组中查找数字 一共分为三小题&#xff1a; 题目一&#xff1a;数字在排序数组中出现的次数题目二&#xff1a;0 ~ n-1 中缺失的数字题目三&#xff1a;数组中数值和下标相等的元素 2…

【创作赢红包】面向对象基础概念

什么是面向对象 面向对象&#xff08;Object Oriented&#xff09;是软件开发方法&#xff0c;一种编程范式&#xff0c;它是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物。 早期的计算机编程是基于面向过程的方法&#xff0c;如实现算…

前端工程化:环境准备—NodeJs安装-Vue项目开发流程

一、前端工程化-Yapi 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务 地址&#xff1a; http://yapi.smart-xwork.cn/ 具体操作步骤&#xff1a; 1、添加项目 2、添加接口&#xff1a;根据ID查…

技术分享 | observer 资源水位介绍

作者&#xff1a;郭斌斌 爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 OceanBase 集群界面会展示 Observer …

MATLAB绘制柱状/饼图填充图

MATLAB绘制柱状填充图方法1&#xff1a;hatchfill2工具1.1 案例1&#xff1a;柱状图填充1.2 案例2&#xff1a;饼图填充方法2&#xff1a;applyhatch函数2.1 案例1&#xff1a;柱状图填充2.2 案例2&#xff1a;饼图填充方法3&#xff1a; applyhatch_plusC函数3.1 案例1&#x…

Python 小型项目大全 31~35

三十一、猜数字 原文&#xff1a;http://inventwithpython.com/bigbookpython/project31.html 猜数字是初学者练习基本编程技术的经典游戏。在这个游戏中&#xff0c;电脑会想到一个介于 1 到 100 之间的随机数。玩家有 10 次机会猜出数字。每次猜中后&#xff0c;电脑会告诉玩…

Java实现ArrayList和底层源码讲解

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Centos7安装MySQL5.7.30

文章目录1. 环境准备1.1 卸载mariadb1.2 下载MySQL 5.7.301.3 安装MySQL依赖项1.4 创建目录1.5 创建用户和用户组1.6 修改Mysql用户权限2. 安装MySQL2.1 解压2.2 修改解压目录名称2.3 初始化2.4 添加my.cnf异常找不到Sock文件2.5 启动MySQL服务2.5.1 建立软连接2.5.2 启动2.6 设…

TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

目录 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 UDP和TCP对比 滑动窗口 由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的…

基于支持向量机的Digits手写数字识别

基于支持向量机的Digits手写数字识别 描述 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;模型既可以用于分类也可以用于回归。手写数字识别是一个多分类问题&#xff08;判断一张手写数字图片是0~9中的哪一个&#xff09;&#xff0c;数据集…

图片英文翻译成中文转换器-中文翻译英文软件

您正在准备一份重要的英文资料或文件&#xff0c;但是您还不是很熟练地掌握英文&#xff0c;需要翻译才能完成您的任务吗&#xff1f;哪个软件能够免费把英文文档翻译成中文&#xff1f;让我们带您了解如何使用我们的翻译软件来免费翻译英文文档为中文。 我们的翻译软件是一款功…

C风格的字符串赋值方式

文章目录&#xff08;1&#xff09;C语言中&#xff0c;没有字符串类型但可以用字符数组模拟字符串。&#xff08;2&#xff09;C语言中&#xff0c;字符串是以’\0’作结尾字符。&#xff08;3&#xff09;C语言中&#xff0c;字符串常量本质上是一个无名的字符数组。C风格的字…

使用Spring JDBC中的JdbcTemplate对数据进行增删改查操作教程~

jdbcTemplate实现添加数据功能&#xff1a; spring框架对jdbc框架进行封装&#xff0c;使用jdbcTemplate方便实现对数据库的操作 数据库准备工作&#xff1a; 在已有数据库中创建新的表&#xff1a; create table t_user (id int,username varchar(20),password varchar(20…