cmake 入门学习

CMake 中设置 C++ 标准方式总结 适合需要精细控制编译选项,同时要指定 C++ 标准和其他特定编译选项的场景,但要注意代码的可移植性。:推荐在大多数情况下使用,尤其是注重代码可移植性和遵循 CMake 最佳实践的项目,它能让 CMake 自动处理 C++ 标准的设置。:适用于需要为所有源文件统一添加编译选项的场景,但不适合仅为 C++ 文件设置 C++ 标准。 阅读详情

https://alenstar.github.io/post/cmake_template/

 

首先我们来看看我们的工程目录结构

$ tree myproject

myproject  # 工程目录
├── CMakeLists.txt # 入口CMakeLists.txt文件
├── example.c
├── include  # 头文件目录
│   ├── arch.h
│   ├── base.h
│   ├── common.h
│   └── data.h
├── LICENSE
├── README.md
└── src  # 源代码目录
    ├── arch.c
    ├── base.c
    ├── CMakeLists.txt  # 子CMakeLists.txt文件
    ├── common.c
    └── data.c

入口CMakeLists.txt文件分析

# 设置最低cmake版本要求
cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR) 

#支持 pkg-config
include(FindPkgConfig)
#检查 libcurl cairo 等模块, 并获取它们的LIBS和INCLUDE, 结果保存到变量 LB_LIBS_XXX 中
# LB_LIBS_INCLUDE_DIRS # 保存包含路径
# LB_LIBS_LIBRARIES # 保存连接库
pkg_check_modules(LB_LIBS REQUIRED libcurl cairo)


# 设置项目名称
project(myproject) 

# 检查编译目录和源码是否为同一目录, 如果是则提示错误
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
    message(FATAL_ERROR "Do not build in-source.\nPlease remove CMakeCache.txt and the CMakeFiles/ directory.\nThen: mkdir build ; cd build ; cmake .. ; make")
endif()

if( CMAKE_BUILD_TYPE STREQUAL "Release" )
    add_definitions(-DNODEBUG)
else()
    add_definitions(-DDEBUG)
	#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -O0 -ggdb")
	#set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -ggdb")
	#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -O0 -ggdb")
	#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -ggdb")
endif()
	
set(CMAKE_CXX_STANDARD 11)

# 设置变量 PROJECT_NAME 并初始化, 使用 ${XXX} 引用, 如: ${PROJECT_NAME} 
set(PROJECT_NAME "xxx")

add_definitions(-DDEBUG) # 添加宏定义

# 设置CMAKE_C_FLAGS, `${CMAKE_C_FLAGS}` 可取出CMAKE_C_FLAGS的值
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb") 

# 添加include目录(-l)
include_directories(src) 
include_directories(include) 

# 设置 XXX_TESTS 为 OFF
set(XXX_TESTS OFF CACHE BOOL "")
# 添加子目录, 子目录要包含CMakeLists.txt文件
add_subdirectory(src) 

# 添加可执行文件 example 的生成规则, 后面接依赖文件或者文件列表
add_executable(example example.c) 
# 设置可执行文件 example 的链接库, 后面接的可以是系统库, 也可以是 子目录下的自定义库
target_link_libraries(example lib) 

# 检测是否配置了编译类型[Release|Debug], 如果没有配置则配置为Release
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING
  "Choose the type of build, options are: Debug Profile Release Asan Ubsan." FORCE)
endif(NOT CMAKE_BUILD_TYPE)

子CMakeLists.txt文件

cmake_minimum_required(VERSION 2.6) # cmake 版本要求
project(lib) # 项目名称

# 设置option 
# 可以在 add_subdirectory(xxx) 时用 set(XXX OFF|ON CACHE BOOL "") 来设置值
#        名称 描述        默认值[ON | OFF]
# option(XXX "描述 ... " ON) 
option(XXX_TESTS "Build xxx tests and enable testing" ON)
option(XXX_STATIC "Build static library" ON)
option(XXX_SHARED "Build shared library" ON)

# 根据 option 条件编译
# if 语句 支持逻辑运算 [AND | OR | NOT] ; #支持else分支: if() else() endif()
if(XXX_TESTS) 
  # TODO
  # enable_testing()
  # add_subdirectory(test testdir)
endif()

# 设置包含目录( `./` 当前目录)
include_directories(./) 

# 设置文件列表SRC_FILES (自定义名称) 的文件内容( 包含的文件 )
set(SRC_FILES arch.c base.c common.c data.c) 

# 添加静态库 lib 的生成规则, 依赖 SRC_FILES
add_library(lib STATIC ${SRC_FILES}) 
# 添加动态态库 lib 的生成规则, 依赖 SRC_FILES
add_library(lib_shared SHARED ${SRC_FILES}) 

构建项目

为了保持项目目录的干净, 我们一般会在build目录下进行构建

$ mkdir build # 创建构建目录
$ cd build # 进入构建目录
$ cmake .. # 从上级目录构建, 构建产生的临时文件和目标文件将在当前目录生成
$ make # 生成目标

添加 c++11 支持

添加一个编译器选项 add_compile_options(-std=c++11) # CMake 2.8.12 or newer不过这种方式不够灵活

使用set来设置cmake内置变量

set(CMAKE_CXX_STANDARD 11) # C++11...
set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required...
set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11

为特定目标进行设置, set_target_properties 可以为要生成的目标设置属性 PROPERTIES 以实现不同目标的差异处理

set_target_properties(myTarget PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
    CXX_EXTENSIONS OFF
)

设置运行时库搜索路径 (gcc -Wl,-rpath=./)

set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "./")

设置链接时库搜索路径 (gcc -L./)

LINK_DIRECTORIES("./lib")

其他-使用自定义动态/静态库

# copy local file 拷贝文件
configure_file(${CMAKE_SOURCE_DIR}/libsqlite3.so ${CMAKE_BINARY_DIR}/libsqlite3.so COPYONLY)

# add local library 添加库文件
add_library(sqlite3 SHARED IMPORTED) # or STATIC instead of SHARED

# 设置库文件属性(文件路径,头文件目录)
set_target_properties(sqlite3 PROPERTIES
   IMPORTED_LOCATION "${CMAKE_BINARY_DIR}/libsqlite3.so"
   INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include")

# 添加到链接目标
target_link_libraries(<TARGET> sqlite3)

使用自定义命令

# 添加命令, OUTPUT 输出, COMMAND 命令
add_custom_command(
    OUTPUT  ${CMAKE_BINARY_DIR}/message.proto3.pb.cc
    COMMAND ${PROTOC} --cpp_out=${CMAKE_BINARY_DIR} --proto_path=${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/message.proto3
)
# 添加到 OUTPUT 到 SRCS 变量中 (OUTPUT必须被依赖,否则不会执行命令)
List (APPEND SRCS  ${CMAKE_BINARY_DIR}/message.proto3.pb.cc)

包含cmake格式的配置文件

include(xxxx.cmake)

包含子工程

# 添加子目录, 子目录要包含CMakeLists.txt文件
add_subdirectory(subdir) 

OS define

if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
    set(WINDOWS TRUE)
    message(WARNING "only for Windows")
else()
    set(LINUX TRUE)
    message(WARNING "only for linux")
endif()

cross build

if(BUILD_FOR_ARM)
    SET(CROSS_TOOLS_PATH /opt/crosstools/arm-2009q3/bin/arm-none-linux-gnueabi)
    SET(CROSS_ROOT_PATH /opt/crosstools/sys-root)

    # this one is important
    SET(CMAKE_SYSTEM_NAME Linux)
    #this one not so much
    SET(CMAKE_SYSTEM_VERSION 1)

    # specify the cross compiler
    SET(CMAKE_C_COMPILER   ${CROSS_TOOLS_PATH}-gcc)
    SET(CMAKE_CXX_COMPILER ${CROSS_TOOLS_PATH}-g++)

    # where is the target environment
    SET(CMAKE_FIND_ROOT_PATH  ${CROSS_ROOT_PATH})

    # search for programs in the build host directories
    SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    # for libraries and headers in the target directories
    SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endif()

使用文件配置交叉编译工具链

# 文件 arm-none-linux-gnueabi-gcc.cmake
SET(CROSS_TOOLS_PATH /opt/crosstools/arm-2009q3/bin/arm-none-linux-gnueabi)
SET(CROSS_ROOT_PATH /opt/crosstools/sys-root)

# this one is important
SET(CMAKE_SYSTEM_NAME Linux)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)

# specify the cross compiler
SET(CMAKE_C_COMPILER   ${CROSS_TOOLS_PATH}-gcc)
SET(CMAKE_CXX_COMPILER ${CROSS_TOOLS_PATH}-g++)

# where is the target environment
SET(CMAKE_FIND_ROOT_PATH  ${CROSS_ROOT_PATH})

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# 使用交叉工具链编译工程
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../arm-none-linux-gnueabi-gcc.cmake ..
CMake入门学习资料汇总 自己做了一段时间的CMake工作, 把CMake入门的一些相关资料罗列出来, 供以后自己查阅: 基础工具: 1. CMake官方网站主页    https://cmake.org/ 2. CMake在线文档帮助手册 https://cmake.org/documentation/ 包含CMake的各个历史版本, 提供了对各版本的强大的搜索功能, 帮助手册提供的内容非常的详细并且完整。 阅读详情

相关推荐

CMake基础教程(15)cmake指定C++ 11标准

# specify the C++ standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) 以上两句必须在add_executable前面

二进制君 5569

cmake学习(CMakeLists.txt写法)

经典的CMakeLists.txt写法: cmake --build . 即compile/link the project脚本自动化生成 设置debug的后缀 cmake是一个buildsystemcmake的项目是由target定义的,生成目标有可执行程序和库两种,分别用 add_executable() 和 add_library()cmake --open ....

weixin_39445116的博客 625

CMake:设置编译C++的版本

如果设置为 `ON`,那么 CMake 会要求编译器必须支持CMAKE_CXX_STANDARD中设置的 C++ 版本,否则会配置失败。如果设置为OFF或者未设置,那么如果编译器不支持 CMAKE_CXX_STANDARD中设置的 C++ 版本,CMake 会回退到编译器支持的最新版本。CMake提供了CMAKE_CXX_STANDARD用于设置C++的版本,比如可以通过如下方式设置使用C++23。

风静如云的博客 676

CMAKE_CXX_STANDARD 与 CMAKE_CXX_STANDARD_REQUIRED 的区别与联系

CMAKE_CXX_STANDARD与CMAKE_CXX_STANDARD_REQUIRED

威桑的博客 2524

CMake 入门指南:编程学习

在本篇文章中,我们将一起学习如何入门使用 CMake,并通过编程学习来加深对其的理解。CMake 是一个开源的构建工具,它使用简单的语法规则来描述项目的构建过程。与直接使用特定编译器的构建系统不同,CMake 允许你生成与平台无关的构建脚本,从而使你的项目在不同的操作系统和编译器上都能够顺利构建。CMake 的构建过程是通过一个名为 CMakeLists.txt 的文本文件来定义的。命令告诉 CMake 在当前目录中查找 CMakeLists.txt 文件,并生成相应的构建文件。在上述示例中,我们使用。

database_bug768的博客 136

配置权重_高盛都在用的资产配置模型,BL贝叶斯框架改进Markowitz

前面我们说到,markoviz的均值-方差模型,第一次,用数学的方式严格证明了投资组合存在最优的权重,但它的学术意义大于实战。主要原因有两个:1,人们很难有效的预测期望收益率;2,最优资产组合配置对输入非常敏感,结果往往难以被人理解。还有就是在投资中,定量只是完成初步构建,同步的定性判断依然非常重要:第一,投资者的认知偏好:倾向于关注他们认为被低估,但有发展潜力或者可以确定相对交易价值的小部分股票...

weixin_39892309的博客 715

【CMake基础入门教程】学习规划&第一课:什么是CMake?

摘要:这是一个CMake入门课程的框架,分为四个阶段:从基础语法到进阶功能。第一课介绍了CMake的作用(生成跨平台构建文件而非直接编译),并通过一个简单的"Hello,CMake!"程序演示了基本使用流程:创建CMakeLists.txt→构建→运行。课程提供了详细的练习包(

ffffffeiyu的博客 928

Dirsearch的下载、安装和使用(全)

Dirsearch工具的下载、安装和使用,超详细超全面

weixin_68416970的博客 1万+

CMake学习入门和进阶详解

CMake 是一个跨平台的构建系统生成工具,用于管理软件构建过程。它通过 CMakeLists.txt 文件描述项目的构建规则,并生成适合不同平台的本地构建文件(如 Makefile、Visual Studio 项目等)。CMake 的核心作用包括跨平台构建、自动化依赖管理、模块化配置以及支持多种构建系统生成器。其关键特点包括声明式语法、缓存机制和集成测试与打包工具。典型的工作流程包括编写 CMakeLists.txt、运行 cmake 生成构建文件,以及调用本地构建工具编译代码。

weixin_43484713的博客 1330

QGIS003:【02标注工具栏】-标注的样式、放置和属性修改

摘要:文本介绍了QGIS标注的样式、放置和属性修改

qq_31762031的博客 1916

【WRFDA教程第四期】雷达数据同化(Radar Data Assimilation)

雷达数据同化(Radar Data Assimilation)

WW、forever的博客 1758

CMake从入门到精通学习资料

CMake从入门到精通学习资料 去发现同类优质开源项目:https://gitcode.com/ 这是一份关于CMake的详细学习资料,标题为《CMake从入门到精通.pdf》。本资料深入浅出地讲解了CMake的相关知识,非常适合新手学习和掌握。 本资料特点: 内容丰富,讲解到位 适合不同水平的学习者 案例详实,易于理解 通过这份资料,您将能够系统地了解CMake的基础知识,并逐步掌握其高级应...

gitblog_06704的博客 378

软件测试面试题之易错题

(1)白盒测试:又称功能功能 测试、数据驱动测试和行为测试,是一种从用户观点出发的测试,被测程序为黑盒子, 通过测试来检测每个功能是否能够正常使用。(2)黑盒测试:又称结构测试和逻辑驱动 测试,是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书 的规定去正常运行。(1)、测试需求分析;(2)动态白盒测试:需要对各个模块功能、模块间的接口、局部数据结构、主要执行路径、 错误处理等方面的测试。(2) 集成测试所测试的对象是模块间的接口,其目的是在找出在模块接口上面,包括整体体系结构上的问题;

m0_37449634的博客 678

cmake学习入门(一)

set指定的变量,都是都是字符串类型#var是变量名,调用时:${var}

m0_47577813的博客 300

【CVPR2025 DEIM】超详细!手把手训练自己的数据集教学:从源码下载,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。本文在win系统上训练,最强实时目标检测算法!

本文详细介绍了CVPR2025 DEIM目标检测模型的完整使用流程。内容包含:1)源码下载与虚拟环境配置;2)Visdrone2019数据集准备与配置文件修改;3)训练参数设置及Windows系统常见问题解决方案;4)模型验证、推理测试及热力图生成方法。特别针对Windows用户提供了虚拟环境配置指导,并详细说明了数据集路径设置、参数调整等关键步骤。通过本文的指导,小伙伴可以快速掌握DEIM模型的使用方法,用于学术论文研究和实验分析。

Ai缝合怪、助力小伙伴高效发论文 7615

YOLO26涨点改进 | 小目标损失函数独家改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

目录一、前言:YOLO26原生损失函数在小目标检测中的核心痛点(涨点瓶颈)1.1 小目标权重不足,聚焦能力薄弱1.2 样本分布不平衡适配性差,正负样本权重失衡1.3 训练不稳定,易出现梯度消失/震荡1.4 未区分小目标与背景的冗余干扰,误检率高二、TGRS 2025顶刊灵感解析:自适应聚焦损失的核心逻辑三、全网独家创新:AdaFocalLoss损失函数设计与YOLO26适配(核心重点,可复现)3.1 AdaFocalLoss函数整体设计(独家设计,清晰可复现)3.2 各核心模块详细设计(独家创新,可直接复现

qq_36130719的博客 202

Cmake入门学习指南

cmake 的官方的教程,里面的内容很简单,并且有简单的习题帮助你理解 cmake。

Megahertz66的博客 566

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Cmake学习之cmake入门

cmake入门

Thinkobj的博客 406

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

很好的cmake学习入门

我见过的最好的入门课 cmake 学习笔记(一)

jmppok的专栏 1124

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

cmake入门个人学习笔记(1)

本文记录了作者学习CMake的入门笔记,主要介绍了CMake的基本概念和使用方法。CMake是一种跨平台的自动化构建系统,通过配置CMakeLists.txt文件来管理项目构建流程。文章详细讲解了常用指令如cmake_minimum_required、project、add_executable、aux_source_directory等的使用方法,并通过示例演示了如何构建简单项目和优化项目结构(如将源文件、头文件、可执行文件分别存放在src、include、bin目录中)。最后提到后续将学习动态库的创建和

qq_63049181的博客 683

CMake从入门到精通学习资料:掌握构建系统的利器

CMake从入门到精通学习资料:掌握构建系统的利器 去发现同类优质开源项目:https://gitcode.com/ 在软件开发领域,构建系统是项目成功的关键之一。CMake作为一款跨平台的安装(编译)工具,其重要性不言而喻。本文将为您详细介绍一个名为“CMake从入门到精通学习资料”的开源项目,帮助您轻松掌握CMake的核心功能和使用场景。 项目介绍 《CMake从入门到精通.pdf》是一份专为...

gitblog_06799的博客 284

cmake入门学习

要实现单一 CMakeLists 文件支持多种编译器架构,同时保持项目结构和代码不变,需要使用 CMake 的。带有头文件cmake编译。

2201_75286049的博客 393

CMake入门学习

简介 什么是CMake,解决了什么问题? CMake的官方定义:CMake是一个开源的跨平台自动化构建系统,用来管理软件建制的程序,并不依赖于某个特定编译器。CMake并不直接构建出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的构建方式使用。它允许开开发者编写一种平台无关的CMakeList.txt文件来定制整个变异流程,然后再更具目标用户的平台进一步生成所需的本地化Makefile和工程文

viyana的博客 3328

CMake入门以及学习笔记

使用cef3替代chromium内核开发产品过程中,第一次接触到系统构建,使用了最常见的CMake。CMake虽然在构建系统中用的比较多,但是使用到的程序员还是很少的。现在在国内能找到的相关资料和博客比较多,本人在学习中也看了很多人的博客,比如 CMake学习(一) , CMake语法之流程控制 等。再次感谢这些作者的分享。下边提供一些系统学习的资料。 CMake的官网地址:http://ww...

weixin_30920513的博客 116

CMake 入门学习2 使用VSCode cmake插件

CMake 入门学习2 使用VSCode cmake插件 一、准备环境 vscode gcc gdb cmake vscode 安装插件:CMake Tools 二、操作步骤 1. 新建一个目录 mkdir -p d:/documents/cmake 新建一个main.cpp文件: #include <iostream> int main(int argc, char *argv[]) { std::cout << "Hello CMake!" << s

猿来这样-谢厂节的博客 5274
上一篇: Linux(Ubuntu)下嵌入式gdb调试环境
下一篇: 后端架构师技术图谱
Omni-Space
博客等级 码龄11年 2158粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值