首页 > 其他分享 >我的CMake项目结构

我的CMake项目结构

时间:2024-10-08 10:46:15浏览次数:1  
标签:CMAKE NAME 项目 SOURCE CMake true xxxxx DIR 结构

我的CMake项目结构

项目类型

  • 类库项目 项目的主要输出目标为库文件
  • 可执行项目 项目的主要输出为可执行文件

项目结构

  • 3rdparty 第三方库
    • xxx 库名称,如stb、spdlog
      • include 头文件
      • src/lib/... (可选)源文件、库文件等
  • src 项目源码
    • CMakeLists.txt
  • demo (可选)例程,一般类库项目会有
    • CMakeLists.txt
  • .clang-format clang格式化配置
  • .clangd clangd配置
  • .gitignore git忽略列表
  • CMakeLists.txt 主要CMakeLists,包含子项目
  • README.md 项目说明
  • LICENSE

3rdparty

第三方库,一般编译输出结果为bin、lib、include,我们首先创建目录,命名就是第三方库名称,然后将include和lib放进去即可,在CMakeLists.txt中包含该库时包含到前述目录

有些header-only的库只有include,如stb

有些库需要包含源文件,如glad

src

不一定叫这个名字,但其作用是一样的,就是列出项目的主要源文件

注意版本号按需配置

创建库:

cmake_minimum_required(VERSION x.xx)

get_filename_component(DIR_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
project(${DIR_NAME})

aux_source_directory("${CMAKE_CURRENT_SOURCE_DIR}" SRC)

add_library(${PROJECT_NAME} ${SRC})

set(CMAKE_PREFIX_PATH
    "${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/xxxxx/lib/cmake/xxxxx"
)

find_package(xxxxx REQUIRED)

target_include_directories(${PROJECT_NAME} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/xxxxx/include"
)

target_link_directories(${PROJECT_NAME} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/xxxxx/lib"
)

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    target_link_options(${PROJECT_NAME} PRIVATE "/NODEFAULTLIB:MSVCRT")
endif()

target_link_libraries(${PROJECT_NAME} PRIVATE
    xxxxx::xxxxx
    "yyyyy"
)

创建可执行文件:

cmake_minimum_required(VERSION x.xx)

get_filename_component(DIR_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
project(${DIR_NAME})

aux_source_directory("${CMAKE_CURRENT_SOURCE_DIR}" SRC)

add_executable(${PROJECT_NAME} ${SRC})

set(CMAKE_PREFIX_PATH
    "${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/xxxxx/lib/cmake/xxxxx"
)

find_package(xxxxx REQUIRED)

target_include_directories(${PROJECT_NAME} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/xxxxx/include"
)

target_link_directories(${PROJECT_NAME} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/xxxxx/lib"
)

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    target_link_options(${PROJECT_NAME} PRIVATE "/NODEFAULTLIB:MSVCRT")
endif()

target_link_libraries(${PROJECT_NAME} PUBLIC
    xxxxx::xxxxx
    "yyyyy"
)

demo

对于类库项目,可能提供一组样例,里面可能包含多个子项目

.clang-format

我比较习惯的一组配置

BasedOnStyle: LLVM
UseTab: Never
IndentWidth: 4
TabWidth: 4
IndentCaseLabels: false
ColumnLimit: 0
AlignAfterOpenBracket: DontAlign
AccessModifierOffset: -4
NamespaceIndentation: All
FixNamespaceComments: false
SortIncludes: false
# AlignConsecutiveShortCaseStatements: true
AllowShortBlocksOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: true
# AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: All
# AllowShortIfStatementsOnASingleLine: true
AllowShortLambdasOnASingleLine: All
# AllowShortLoopsOnASingleLine: true
BreakBeforeBraces: Custom
BraceWrapping:
  AfterCaseLabel: true
  AfterClass: true
  AfterControlStatement: Always
  AfterEnum: true
  AfterFunction: true
  AfterNamespace: true
  AfterObjCDeclaration: true
  AfterStruct: true
  AfterUnion: true
  AfterExternBlock: true
  BeforeCatch: true
  BeforeElse: true
  BeforeLambdaBody: false
  BeforeWhile: true
  IndentBraces: false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
  SplitEmptyNamespace: true

.clangd

也是我习惯的配置

自动补include纯属瞎搞,检测未使用的include也是瞎检测,因此都忽略了

Diagnostics:
  MissingIncludes: None
  UnusedIncludes: None

.gitignore

忽略vscode配置、clangd解析缓存、cmake构建文件

.vscode
.cache
build

CMakeLists.txt

整体的文件,主要用于包含子项目

注意CMAKE_EXPORT_COMPILE_COMMANDS适用于生成compile_commands.json的,这个文件用于clangd解析,很好用,但并非所有编译器都支持,gcc是支持的,MSVC就不支持,因此在Windows上,我选择使用clangd

cmake_minimum_required(VERSION x.xx)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

get_filename_component(DIR_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
project(${DIR_NAME})

# set(CMAKE_CXX_STANDARD 20)
# set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_subdirectory(src)
add_subdirectory(demo)

不慎成熟,欢迎拍砖

标签:CMAKE,NAME,项目,SOURCE,CMake,true,xxxxx,DIR,结构
From: https://www.cnblogs.com/ippfcox/p/18451214

相关文章

  • 4、.Net 快速开发框架:Blog.Core - 开源项目研究文章
    Blog.Core是一个基于.NETCore的开源博客系统,旨在提供一个简单、易用且功能丰富的博客平台。它采用最新的.NET技术栈,包括但不限于ASP.NETCore、EntityFrameworkCore、RazorPages等,以确保高性能和良好的开发体验。主要特性跨平台:作为.NETCore应用程......
  • XTimer定时微服务项目
    Xtimer定时微服务项目背景在学校社团中,有给社团成员发送活动通知的任务需求有定期执行某项任务的需求,比如每周末举办一次线下活动,每个月举行一次团建再比如,我有一个任务需要设置定时发布定时微服务调研对比方案不足点JavaTimer单线程,任务堆积RocketMq可以作为......
  • 从LLaMA-Factory项目认识微调
    https://www.cnblogs.com/lm970585581/p/18140564 什么是LLaMA-Factory?LLaMA-Factory是一个在github上开源的,专为大模型训练设计的平台。项目提供中文说明,可以参考官方文档:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md为什么要学习LLaMA-Factory?大模型......
  • 数据结构课程设计大项目————迷宫问题(邻接矩阵,prim生成算法,DFS寻路,BFS寻路,路径回溯
    一.前言迷宫问题是数据结构中最值得实践的大项目之一,本文主要讲解思路,提供的代码大部分都有注释(没有的就是太多了懒得写了QAQ)。为了更好的表现效果,该程序使用了easyx可视化,easyx简单易学(大概一天到两天就可以学会),上手简单。该程序由c语言实现,本人水平有限程序可优化空间很大。......
  • 4、Linux中断系统中的重要数据结构
    本节内容,可以从request_irq(include/linux/interrupt.h)函数一路分析得到。能弄清楚下面这个图,对Linux中断系统的掌握也基本到位了 最核心的结构体是irq_desc,之前为了易于理解,我们说在Linux内核中有一个中断数组,对于每一个硬件中断,都有一个数组项,这个数组就是irq_desc......
  • 关于鸿蒙自己搭建项目环境要注意的点
    具体步骤如下https://xie.infoq.cn/article/4c72d00fab3499bc78de4fdd3但是与nativec++相关的东西不止上面还少不了CMakeList.txt, #theminimumversionofCMake.cmake_minimum_required(VERSION3.5.0)project(MyApplication)set(NATIVERENDER_ROOT_PATH${CMAKE_CU......
  • 信息学奥赛复赛复习14-CSP-J2021-03网络连接-字符串处理、数据类型溢出、数据结构Map
    PDF文档公众号回复关键字:202410071P7911[CSP-J2021]网络连接[题目描述]TCP/IP协议是网络通信领域的一项重要协议。今天你的任务,就是尝试利用这个协议,还原一个简化后的网络连接场景。在本问题中,计算机分为两大类:服务机(Server)和客户机(Client)。服务机负责建立连接,客户机......
  • 高效开发Maven架构设计图解/掌握项目工程自动化技巧(精通篇二)
    Maven是一个项目管理和构建自动化工具,主要服务于基于Java的项目。它使用一个名为POM(ProjectObjectModel)的XML文件来描述项目的构建过程、依赖、插件等信息。肖哥弹架构 跟大家“弹弹” 高并发锁,  关注公号回复'mvcc'获得手写数据库事务代码欢迎点赞,关注,评论。关注......
  • Redis终极入门指南:万字解析帮你从零基础到掌握命令与五大数据结构
    目录命令学习:一、Redis基础操作二、Redis常用命令三、五种数据结构及其常用命令3.1String(字符串)3.2List(列表)3.3Set(集合)3.4Hash(哈希)3.5Zset(有序集合) 前言:  Redis是一款开源内存数据库,以高性能和多样数据结构广泛应用于缓存和消息队列等场景。本文为新......
  • 信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构体
    PDF文档公众号回复关键字:202410061P7910[CSP-J2021]插入排序[题目描述]插入排序是一种非常常见且简单的排序算法。小Z是一名大一的新生,今天H老师刚刚在上课的时候讲了插入排序算法。假设比较两个元素的时间为O(1),则插入排序可以以O(n^2)的时间复杂度完成长度为......