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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 泛型编程 首先让我们来思考一个问题&#xff0c;如何实现一个交换函数&#x…

企业有必要使用OVSSL证书吗?

在数字化时代&#xff0c;SSL证书不仅仅是一种技术保障&#xff0c;它更是企业线上服务的重要组成部分。企业级OVSSL证书以其独特的优势&#xff0c;为企业带来了多重好处。 包含以下几点&#xff1a; 1、增强信任度&#xff1a;OV SSL证书在颁发前会对组织的身份进行验证&…

找出一个整型数组中的元素的最大值

这个问题在之前的文章中曾用其他方法解决&#xff0c;现在用类来处理&#xff0c;读者可以比较不同方法的特点。 编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 程序看起来比较长&#xff0c;其实并不复杂&#xff0c;它包括以下3部分&#xff1a;…

生产实习Day13 ---- 神经网络模型介绍

文章目录 传统的神经网络模型注意力机制的引入注意力机制的本质Encoder-Decoder 框架注意力机制在 Encoder-Decoder 中的应用Self-Attention 机制Transformer 模型注意力机制的优势总结 传统的神经网络模型 在深度学习中&#xff0c;传统的神经网络模型&#xff0c;如循环神经…

【离散数学】图的随机生成和欧拉(回)路的确定(c语言实现)

实验要求 变量定义 因为如果我们使用局部变量&#xff0c;每一个函数都会使用这些变量&#xff0c;会让函数的参数越变越多。所以我们定义全局变量&#xff0c;这样就不用在参数中调用了。 #define MAX 100 int arrMap[MAX][MAX] { 0 };//图的矩阵 int degree[MAX] { 0 };…

[职场] 提升学历考研再就业有必要吗 #其他#知识分享

提升学历考研再就业有必要吗 有很多人觉得自己学历不够高&#xff0c;求职第一关可能就通过不了。因此想要继续攻读&#xff0c;最近有人问小编提升学历考研有必要吗&#xff1f;“硕士学历和三年的工作经验哪个更重要?” 这个还是要针对具体岗位而言。综合类型的岗位往往不需…

免费分享:2000-2020年中国长时间序列夜间灯光数据集(附下载方法)

夜间灯光数据集直观反映了地表夜间灯光亮度&#xff0c;进而揭示了人类活动强度&#xff0c;为分析城市扩张、人口迁移、经济发展等提供了连续、全面的视角&#xff0c;有助于深入理解中国城市化的历史进程和未来趋势。 数据简介 基于DMSP/OLS第四版非辐射定标夜间年平均灯光强…

【HW必备】用友NC-Cloud存在17处漏洞合集

漏洞简介 NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构&#xff0c;技术先进、性能稳定、自主安全可控&#xff0c;支撑大中型以及超大型集团企业N层多site混合云部署方案&#xff0c;支持整个系统高可…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编…

MySQL数据库(四):视图和索引

在数据库管理中&#xff0c;视图和索引是两种关键工具&#xff0c;它们各自发挥独特的作用以优化数据查询和管理。视图通过简化复杂查询、提高数据安全性和提供数据抽象&#xff0c;帮助用户轻松访问数据。而索引则通过加速查询、确保数据唯一性以及优化排序和分组操作&#xf…

哪个牌子充电宝好?好用充电宝排行榜!精选充电宝排行榜

在如今这个科技飞速发展的时代&#xff0c;充电宝已然成为我们日常生活中不可或缺的伴侣。无论是出差旅行&#xff0c;还是日常通勤&#xff0c;我们都离不开它为我们的电子设备保驾护航。然而&#xff0c;面对市场上琳琅满目的充电宝品牌&#xff0c;您是否感到眼花缭乱&#…

ONLYOFFICE 桌面编辑器 8.1 强势来袭:解锁全新PDF编辑、幻灯片优化与本地化体验,立即下载!

目录 一、轻松编辑PDF文件 1.1 编辑文本 1.2 添加、旋转和删除页面 1.3 插入和修改对象 1.4 添加注释和标注 1.5 切换编辑或查看模式 1.6 创建和填写表单 二、用幻灯片版式快速修改幻灯片 2.1 选择或创建幻灯片版式 2.2 应用幻灯片版式 2.3 修改幻灯片版式 2.4 使用…

[经验] candy是什么意思英语翻译 #笔记#其他#职场发展

candy是什么意思英语翻译 1、candy的意思 Candy是英语中的一个词汇&#xff0c;意思是糖果、糖果制品。Candy意为果脯的意思也不是很常见。 糖果是一种富含糖分的食品&#xff0c;主要由砂糖、粘合剂和食用色素等组成。糖果的种类可以很多&#xff0c;有硬糖、软糖、巧克力、…

基于YOLOv8m的水族馆动物识别(附数据集和Coovally操作步骤)

本文主要内容:详细介绍了水族馆动物识别的整个过程&#xff0c;从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式&#xff0c;请先看检测效果 现状 随着水族馆行业的快速发展&#xff0c;对动物识别的需求日益增加。水族馆需要准确识别动物种…

【ARM】PK51如何将BL51链接器切换成LX51链接器

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决客户在使用PK51进行项目研发的时候&#xff0c;想要使用LX51链接器进行使用。 2、 问题场景 客户在使用51芯片进行开发的时候&#xff0c;发现工程中使用的是BL51链接器&#xff0c;而不是LX51链接器&#xff…

selenium前期准备

1. 驱动地址&#xff1a; a. chromedriver:https://googlechromelabs.github.io/chrome-for-testing/ b. https://registry.npmmirror.com/binary.html?pathchromedriver/ 下载好的驱动一般放在Python初始文件夹下&#xff0c;例如&#xff1a;D:\Python3.8 2. selenium原理…

基于SSM+Jsp的校园餐厅管理

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

OpenAI CTO米拉·穆拉提谈未来:AI一年半后达到博士水平

人工智能&#xff08;AI&#xff09;领域近年来的发展迅猛&#xff0c;特别是在大语言模型&#xff08;LLM&#xff09;的进步上。最近&#xff0c;OpenAI的首席技术官&#xff08;CTO&#xff09;米拉穆拉提&#xff08;Mira Murati&#xff09;在达特茅斯学院的一次采访中&am…

Java智慧工地源码 5G智慧工地系统源码 使用SAAS部署 三维可视化管理,与一线生产过程相融合,集成数据后台,统一前端入口,呈现多方项目信息;

Java智慧工地源码 5G智慧工地系统源码 使用SAAS部署 三维可视化管理&#xff0c;与一线生产过程相融合&#xff0c;集成数据后台&#xff0c;统一前端入口&#xff0c;呈现多方项目信息; 智慧工地是指运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工…

SpringBoot-注解@PropertiySource读取外部属性文件

ConfigurationProperties和Value两个注解能从配置文件中获取数据&#xff0c;但是前面讲了他们是从全局配置文件中获取&#xff0c;且只能从全局配置文件中获取&#xff0c;那么如果是一些数值类的数据放在全局配置文件里&#xff0c;是不怎么合适的&#xff0c;我们往往会把他…