【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的文件系统
388 4
|
7月前
|
Ubuntu Linux Shell
Linux环境下VSCode快速安装终极指南:debian/ubuntu/linux平台通用
以上就是在Linux环境下安装VSCode的终极指南,抛开繁复的专业词汇,以平易近人的文字、形象生动的比喻让你轻松学会这一过程。别忘了,你的小伙伴VSCode已经在应用菜单里等你了!
2327 23
|
Unix
深入理解 CMake 的 `cmake --build` 命令
深入理解 CMake 的 `cmake --build` 命令
2596 1
|
消息中间件 算法 调度
轻松掌握“裸机”任务调度——使用环形缓冲区、状态机和定时器打造完美方案!
轻松掌握“裸机”任务调度——使用环形缓冲区、状态机和定时器打造完美方案!
|
IDE Ubuntu Linux
【CMake保姆级教程】CMake图文安装教程
【CMake保姆级教程】CMake图文安装教程
1184 0
Makefile中.PHONY的含义
Makefile中.PHONY的含义
1994 0
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
958 0
|
人工智能 自动驾驶 算法
智能时代的桥梁:人工智能在现代交通系统中的应用
本文深入探讨了人工智能技术在改善和提升现代交通系统中的关键作用。通过分析AI在交通管理、自动驾驶汽车以及公共交通优化方面的应用,揭示了AI如何有效解决城市拥堵、提高道路安全和增强出行效率等挑战。文章还预测了未来人工智能技术在交通领域的发展趋势,为读者提供了一个全面而深入的视角。
|
机器学习/深度学习 人工智能 算法
从零构建现代深度学习框架(TinyDL-0.01)
本文主要以一个Java工程师视角,阐述如何从零(无任何二三方依赖)构建一个极简(麻雀虽小五脏俱全)现代深度学习框架(类比AI的操作系统)。
|
NoSQL C语言 C++
C语言开发环境搭建,使用vscode运行hello,world
C语言开发环境搭建,使用vscode运行hello,world
649 0

热门文章

最新文章