【cmake】 --- 一个完整的cmake工程示例

简介: 【cmake】 --- 一个完整的cmake工程示例

背景:工作需求,最近开始接触cmake,由于之前都是用makefile管理工程的,所以一下适应不了,在网上找了一圈,自己整理了一个完整的用cmake管理的工程,废话少说,上菜。

1. 工程tree图

对整个工程目录结构做简单的说明:

1> 顶层目录

其中how_to_generate_sharedLibrary目录是用来生成动态库的示例

thirdparty中存放了生成动态库的头文件和.so文件

2. 各级CMakeLists.txt讲解

1> 顶层CMakeLists.txt讲解

cmake_minimum_required(VERSION 3.5)
project(HelloWorld)
set(CMAKE_C_STANDARD 99)
include_directories(hello/include world/include thirdparty/include)
link_directories(thirdparty/lib)
set(DIR_SRCS ./src/main.c)
add_subdirectory(hello)
add_subdirectory(world)
add_executable(HelloWorld ${DIR_SRCS})
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/thirdparty/lib)
target_link_libraries(HelloWorld hello world calc_library)

逐行解释如下:

// 指定cmake最小可以接受的版本
cmake_minimum_required(VERSION 3.5)
//指定project名字
project(HelloWorld)
// 用set可以设置变量值,这里指定尊书c99标准
set(CMAKE_C_STANDARD 99)
//指定要包含的头文件路径,这里指出了路径,后面在代码中就可以直接用一层包含头文件就可以了
// 不需要在类似中的包含 #include “…/include/xxx.h”;
// 直接 #include "xxx.h"即可
include_directories(hello/include world/include thirdparty/include)
// 指定链接动态库的路径
link_directories(thirdparty/lib)
// 设定DIR_SRCS变量值为 ./src/main.c
set(DIR_SRCS ./src/main.c)
// 进入子文件夹hello,去执行子文件夹下的CMakeLists.txt
add_subdirectory(hello)
// 指定生成的项目名为HelloWorld,DIR_SRCS为其所依赖的源文件
add_executable(HelloWorld ${DIR_SRCS})

2> hello子文件夹CMakeLists.txt分析

include_directories(./include)
set(DIR_SRCS ./src/hello.c)
add_library(hello SHARED ${DIR_SRCS})

子文件夹下不需要再指定cmake版本,编译器版本等

world子文件夹与其类似,不再分析

3. how_to_generate_sharedLibrary — cmake生成动态库以及使用

各个不同的部门之间会存在技术壁垒,或者说分工明确,部门之间不开放源代码,就会给对方一个库和头文件即可

3.1 tree图

3.2 CMakeLists.txt分析

cmake_minimum_required(VERSION 3.5)
project(calc_library)
# 根据库文件代码生成动态库
add_library(calc_library SHARED src/calc.c)
# 创建动态库别名
add_library(calc::library ALIAS calc_library)
# 包含指定头文件所在的目录
target_include_directories(calc_library PUBLIC  ${PROJECT_SOURCE_DIR}/include)
# 创建可执行程序
add_executable(calc_binary 
src/main.c
)
# 链接动态库文件
target_link_libraries(calc_binary PRIVATE calc::library)

4. thirdparty文件夹

thirdparty文件夹下分两个文件夹include 和 lib,分别存放头文件和.so库文件

5. 完整工程下载路径

https://download.csdn.net/download/weixin_42445727/85005764

相关文章
|
存储 负载均衡 算法
p2p的文件系统
p2p的文件系统
460 4
|
9月前
|
Ubuntu Linux Shell
Linux环境下VSCode快速安装终极指南:debian/ubuntu/linux平台通用
以上就是在Linux环境下安装VSCode的终极指南,抛开繁复的专业词汇,以平易近人的文字、形象生动的比喻让你轻松学会这一过程。别忘了,你的小伙伴VSCode已经在应用菜单里等你了!
2645 23
|
消息中间件 算法 调度
轻松掌握“裸机”任务调度——使用环形缓冲区、状态机和定时器打造完美方案!
轻松掌握“裸机”任务调度——使用环形缓冲区、状态机和定时器打造完美方案!
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
985 0
|
人工智能 自动驾驶 算法
智能时代的桥梁:人工智能在现代交通系统中的应用
本文深入探讨了人工智能技术在改善和提升现代交通系统中的关键作用。通过分析AI在交通管理、自动驾驶汽车以及公共交通优化方面的应用,揭示了AI如何有效解决城市拥堵、提高道路安全和增强出行效率等挑战。文章还预测了未来人工智能技术在交通领域的发展趋势,为读者提供了一个全面而深入的视角。
|
传感器 物联网 Linux
物联网设备的操作系统之争:Linux vs RTOS
【6月更文挑战第4天】在遥远的数码星球,物联网城中的Linux先生与RTOS小姐展开激烈角逐,分别在操作系统领域各显神通。Linux先生以其开源、兼容性强、功能丰富占据服务器、桌面及嵌入式设备市场,适合处理复杂任务和需要强大计算能力的设备。而RTOS小姐以实时性、高效响应和低资源占用见长,适用于资源有限、强调实时性的物联网设备。设备制造商在两者间抉择,引发物联网设备操作系统的选择大战。通过Python与FreeRTOS示例,展现了两者在智能家居和生产线控制等场景的应用。在物联网世界,Linux与RTOS共同推动设备智能化,为生活带来更多便捷。
821 3
|
NoSQL C语言 C++
C语言开发环境搭建,使用vscode运行hello,world
C语言开发环境搭建,使用vscode运行hello,world
706 0
|
Java
【JVM调优系列】----NewRatio与SurvivorRatio
-XX:NewRatio 新生代(Eden + 2*S)与老年代(不包括永久区)的比值 4 表示新生代 :老年代 = 1:4 ,意思是老年代占 4/5 -XX:SurvivorRatio 2个Survivor区...
5625 0
|
Unix Linux C语言
cmake使用方法详解
cmake 简介     CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
5312 0
|
机器学习/深度学习 数据采集 人工智能
从零开始构建自己的AI:一个初学者的机器学习教程
通过这个简单的机器学习教程,我们初步了解了从数据收集、选择模型到训练和预测的基本流程。机器学习是一个广阔的领域,有很多知识和技能需要深入学习。希望本教程能为初学者提供一个入门的指引,引导大家探索更多有关机器学习的知识。感谢您阅读本文,如果您有任何问题或想法,请在评论区与我分享!让我们一起踏上机器学习的旅程,构建属于自己的AI。
4594 1
从零开始构建自己的AI:一个初学者的机器学习教程

热门文章

最新文章