news 2026/11/2 6:09:06

CMake基础教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMake基础教程


用法
cmake -B build // 配置,在源码目录用 -B 直接创建 build 目录并生成 build/Makefile
cmake --build build -j4 // 构建,Linux会调用make,Windows会调用devenv.exe
cmake --version

定义
-DCMAKE_INSTALL_PREFIX=/opt/openvdb-8.0 //设置安装路径
-DCMAKE_BUILD_TYPE=Release // 设置发布模式
-DBUILD_SHARED_LIBS:BOOL=ON

变量
PROJECT_SOURCE_DIR:当前项目源码路径(存放main.cpp的地方)
PROJECT_BINARY_DIR:当前项目输出路径(存放main.exe的地方)
CMAKE_SOURCE_DIR:根项目源码路径(存放main.cpp的地方)
CMAKE_BINARY_DIR:根项目输出路径(存放main.exe的地方)
PROJECT_IS_TOP_LEVEL:BOOL类型,表示当前项目是否是(最顶层的)根项目
PROJECT_NAME:当前项目名
CMAKE_PROJECT_NAME:根项目的项目名
PROJECT_VERSION_MAJOR // x
PROJECT_VERSION_MINOR // y
PROJECT_VERSION_PATCH // z
${${PROJECT_NAME}_VERSION}
BUILD_SHARED_LIBS
WIN32, APPLE, Linux, UNIX, ANDROID, IOS // 简写变量,NOT非
CMAKE_CXX_COMPILER_ID
CMAKE_GENERATOR // Ninja
CMAKE_CXX_COMPILER
CMAKE_C_COMPILER
$ENV{PATH} //环境变量

脚本用法
project(项目名 LANGUAGES 使用的语言列表(C/C++ CUDA ASM) VERSION x.y.z)
project(项目名 VERSION x.y.z)
cmake_minimum_required(VERSION 3.15)
set(CMAKE_POSITION_INDEPENDENT_CODE ON) // 允许动态库链接
set_property(TARGET otherlib CMAKE_POSITION_INDEPENDENT_CODE ON) // 允许指定动态库链接
set_property(TARGET main PROPERTY WIN32_EXECUTABLE ON) // win32不启用控制台窗口
set_property(TARGET main PROPERTY LIBRARY_OUT_DIRECTORY ./) // 动态链接库输出路径
set_property(TARGET main PROPERTY ARCHIVE_OUT_DIRECTORY ./) // 静态链接库输出路径
set_property(TARGET main PROPERTY RUNTIME_OUT_DIRECTORY ./) // 可执行文件输出路径
set_properties(main PROPERTYS
CXX_STANDARD 17
LINK_WHAT_YOU_USE ON
)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} C:/cmake)
target_compile_definitions(main PUBLIC MY_MACRO=233 $<$<PLATFORM_ID:Windows,Linux>:MY_NAME=”Bill Gates”>) // $<$<类型:值>:为真时的表达式>
if(MYVAR MATCHER "HELLO") else() endif() //if 的特点:不需要加 ${},会自动尝试作为变量名求值
set(MYVAR ON PARENT_SCOPE) // 子模块变量传递到父模块
if(DEFINED ENV{xx}) // 判断环境变量是否存在
set(ENV{x} ...) // 设置环境变量

自定义FindXXX.cmake
set_target_properties(TBB::tbb PROPERTIES
INTERFACE_COMPILE_DEFINITIONS ""
INTERFACE_INCLUDE_DIRECTORIES "/include"
)

案例exe
cmake_minimum_required(VERSION 3.15)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
set(CMAKE_BUILD_TYPE Release)


project(zeno LANGUAGES C CXX VERSION 0.2.3)

if (PROJECT_BINARY_DIR STREQUAL PROJECT_SOURCE_DIR)
message(WARNING "The binary directory of CMake cannot be the same as source directory!")
endif()

if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

if (WIN32)
add_definitions(-DNOMINMAX -D_USE_MATH_DEFINES)
endif()

if (NOT MSVC)
find_program(CCACHE_PROGRAM ccache)
if (CCACHE_PROGRAM)
message(STATUS "Found CCache: ${CCACHE_PROGRAM}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_PROGRAM})
endif()
endif()

message("PROJECT_NAME: ${PROJECT_NAME}")
message("PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message("PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message("CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
message("CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
add_subdirectory(mylib)

find_package(TBB)
if (TBB_FOUND)
message(STATUS "TBB found at: ${TBB_DIR}")
target_link_libraries(main PUBLIC TBB::tbb)
target_compile_definitions(main PUBLIC WITH_TBB)
else()
message(WARNING "TBB not found! using serial for")
endif()

add_executable(main)
file(GLOB sources CONFIGURE_DEPENDS *.cpp *.h)
aux_source_directory(. sources)
aux_source_directory(mylib sources)
target_sources(main PUBLIC ${sources})
target_link_libraries(main PUBLIC mylib)
target_compile_definitions(main PUBLIC MY_MACRO=233)
target_compile_definitions(main PUBLIC
$<$<PLATFORM_ID:Windows>:MY_NAME="Bill Gates">
$<$<PLATFORM_ID:Linux>:MY_NAME="Linus Torvalds">
$<$<PLATFORM_ID:Darwin>:MY_NAME="Steve Jobs">
)
target_compile_definitions(main PUBLIC
$<$<CXX_COMPILER_ID:GNU,Clang>:MY_NAME="Open-source">
$<$<CXX_COMPILER_ID:MSVC,NVIDIA>:MY_NAME="Commercial">
)
target_compile_definitions(main PUBLIC
$<$<AND:$<CXX_COMPILER_ID:GNU,Clang>,$<PLATFORM_ID:Linux,FreeBSD>>:MY_NAME="Open-source">
)

案例lib
project(mylib)
if (NOT DEFINED BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS ON)
endif()
add_library(mylib STATIC mylib.cpp)
set_property(TARGET otherlib PROPERTY POSITION_INDEPENDENT_CODE ON)
message("mylib got PROJECT_NAME: ${PROJECT_NAME}")
message("mylib got CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
message("mylib got CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
message("mylib got PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message("mylib got PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message("mylib got CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
message("mylib got CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")

引用

project — CMake 3.30.0-rc3 Documentation

CMake常见变量——Project和CMake相关信息_cmake 变量后缀-CSDN博客

cmake-generator-expressions(7) — CMake 3.30.0-rc3 Documentation

CMake: use of true/false or on/off or yes/no in generator expressions - Stack Overflow

if — CMake 3.7.2 Documentation

set — CMake 3.16.9 Documentation

Cmake入门之——Set方法(六)_cmake set-CSDN博客

Ccache — Compiler cache


创作不易,小小的支持一下吧!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 6:07:04

基于MAX14431隔离器实现PIC32 SPI链路隔离的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/2 6:01:52

回形针式思维:硬件维修与调试中的低成本临时方案实战指南

1. 回形针式思维&#xff1a;一个低成本工具背后的解决思路哪怕你对“paperclip”的全部印象&#xff0c;还停留在那个总爱从 Word 里跳出来问“您需要什么帮助”的办公助手&#xff0c;我也建议你重新认识一下这截钢丝。一个标准的回形针&#xff0c;成本不到一分钱&#xff0…

作者头像 李华
网站建设 2026/11/2 6:00:14

SQL转ER图工具:自动解析数据库结构的技术实现

1. 项目背景与核心价值最近在数据库课程设计和实际开发中&#xff0c;经常遇到需要将SQL语句转换为ER图的需求。传统做法是先在PowerDesigner等工具中绘制ER图&#xff0c;再生成SQL语句&#xff0c;但逆向过程却缺乏高效工具。这个SQL转ER图小工具就是为了解决这个痛点而开发的…

作者头像 李华
网站建设 2026/11/2 5:57:30

网络安全运维:命令行效率革命与实战技巧

1. 网络安全运维的现状与痛点每天面对海量告警日志、重复性巡检任务和突发安全事件&#xff0c;运维工程师的日常就像在玩"打地鼠"游戏。我曾见过某金融企业的安全团队&#xff0c;每天要处理3000条安全告警&#xff0c;其中90%都是误报。这种低效的工作模式不仅消耗…

作者头像 李华
网站建设 2026/11/2 5:56:59

Scrapy爬取大众点评:破解字体反爬与动态数据的实战指南

简介&#xff1a;基于Scrapy框架的大众点评爬虫源码&#xff0c;适合有一定Python基础、希望学习Scrapy架构及反爬实战的爬虫开发人员。项目通过浏览器手动登录与验证&#xff0c;规避了验证码识别难点&#xff0c;同时内置代理设置与字体反爬处理&#xff0c;可有效应对大众点…

作者头像 李华
网站建设 2026/11/2 5:56:46

Harness平台入门:从零搭建交付操作系统与插件机制解析

1. 什么是Harness&#xff1f;它不是“ Harness Anything”那种泛泛而谈的口号 Harness不是一句空洞的营销话术&#xff0c;也不是某个AI模型的副产品——它是真实存在的、面向现代软件交付生命周期&#xff08;SDLC&#xff09;的开源编排平台&#xff0c;核心定位是 将CI/C…

作者头像 李华