【CMake学习笔记】|预定义变量(二)

原创 Linux二进制 2024-03-05 15:01

一、内置变量

变量功能
PROJECT_NAME通过PROJECT()命令指定的项目名称
CMAKE_PROJECT_NAME当前项目的名称
PROJECT_SOURCE_DIR使用cmake命令后紧跟的目录,一般是工程的根目录
PROJECT_BINARY_DIR执行cmake命令的目录
EXECUTABLE_OUTPUT_PATH重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH重新定义目标链接库文件的存放位置
CMAKE_SOURCE_DIR顶级 CMakeLists.txt 文件所在路径(这个变量与子目录中的 CMakeLists.txt 文件无关)
CMAKE_BINARY_DIR项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径(这个变量与子目录中的 CMakeLists.txt 文件无关)
CMAKE_CURRENT_SOURCE_DIR当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR当前 CMakeLists.txt 构建输出所在的目录
CMAKE_CURRENT_LIST_DIR当前执行 CMakeLists.txt 文件所在目录
CMAKE_CURRENT_LIST_FILE当前执行 CMakeLists.txt 文件所在路径
CMAKE_CURRENT_LIST_LINE当前执行 CMakeLists.txt 文件所在行号
CMAKE_INSTALL_PREFIX安装目录前缀
CMAKE_MODULE_PATH指定额外的CMake模块搜索路径
CMAKE_PREFIX_PATH用于查找库文件的路径前缀
CMAKE_BUILD_TYPE指定构建类型(比如ReleaseDebug

注意1

  • CMAKE_PROJECT_XXX 表示顶级 CMakeLists.txt 调用 PROJECT() 命令

  • PROJECT_XXX 表示 当前 CMakeLists.txt 调用 PROJECT() 命令

注意2CMAKE_* 与 CMAKE_CURRENT_* 区别在于,CMAKE_* 表示顶级 CMakeLists.txt 文件,CMAKE_CRRUENT_* 表示当前 CMakeLists.txt 文件。

二、编译变量

变量功能
CMAKE_C_FLAGS设置 C 编译器的命令行选项,也可以通过指令 add_definitions() 添加,示例: set(CMAKE_C_FLAGS "-std=c11 -pthread")
CMAKE_C_FLAGS_DEBUG用于Debug配置的C编译标记,示例: set(CMAKE_C_FLAGS_DEBUG "-g -O0")
CMAKE_C_FLAGS_RELEASE用于Release配置的C编译标记
CMAKE_C_COMPILER指定C编译器的完整路径,比如:设置 SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabihf-gcc),但是这句话只有写到PROJECT( project_name)之前才会起作用,或者将一系列设置写在toolchain.cmake文件中
CMAKE_C_COMPILER_ID使用的C编译器标识符
CMAKE_C_STANDARD指定项目编译的C语言版本,如C99,C11
CMAKE_C_STANDARD_REQUIRED是一个布尔值变量,用于指定是否强制使用 CMAKE_C_STANDARD中设置的 C 版本,如set(CMAKE_C_STANDARD_REQUIRED ON)
CMAKE_CXX_FLAGS设置 C++ 编译器的命令行选项,也可以通过指令 add_definitions() 添加
CMAKE_CXX_FLAGS_DEBUG用于Debug配置的C++编译标记
CMAKE_CXX_FLAGS_RELEASE用于Release配置的C++编译标记
CMAKE_CXX_COMPILER指定C++编译器的完整路径
CMAKE_CXX_COMPILER_ID使用的C++编译器标识符
CMAKE_CXX_STANDARD指定项目编译的C++语言版本,如C++14,C++17
CMAKE_CXX_STANDARD_REQUIRED是一个布尔值变量,用于指定是否强制使用 CMAKE_CXX_STANDARD中设置的 C++ 版本,如set(CMAKE_CXX_STANDARD_REQUIRED ON)
CMAKE_COMPILER_IS_GNUCXX如果当前构建使用 GNU C++ 编译器,则此变量值为True
CMAKE_VERBOSE_MAKEFILE如果为TRUE,构建过程将显示更多的信息

注意add_definitions(-DENABLE_DEBUG -DXYZ) # 参数之间用空格分隔

-D 相当于就是定义, -D 可以理解为告诉 cmake 后边我要定义一些参数了, 你每定义一个就在前边加上 -D 就是了。

三、项目变量

变量功能
PROJECT_NAME通过PROJECT()命令指定的项目名称
PROJECT_SOURCE_DIR使用cmake命令后紧跟的目录(即包含最顶层 CMakeLists.txt文件的目录),即项目的源代码根目录
PROJECT_BINARY_DIR项目的构建目录,如果是外部构建,这将与 CMAKE_BINARY_DIR不同
PROJECT_VERSION通过 PROJECT()命令设置的项目版本
PROJECT_VERSION_MAJOR项目的主版本号
PROJECT_VERSION_MINOR项目的次版本号
PROJECT_VERSION_PATCH项目的补丁版本号
PROJECT_VERSION_TWEAK项目的微调版本号(如果指定)
PROJECT_DESCRIPTION项目的描述信息(需要CMake 3.9及以上版本)
PROJECT_HOMEPAGE_URL项目的主页URL(需要CMake 3.12及以上版本)

注意PROJECT_VERSION、 PROJECT_VERSION_MAJOR、 PROJECT_VERSION_MINOR、 PROJECT_VERSION_PATCH和 PROJECT_VERSION_TWEAK变量的设置依赖于 PROJECT()命令中指定的版本信息,格式通常是 PROJECT(ProjectName VERSION major.minor.patch[.tweak])

四、系统变量

变量功能
­CMAKE_SYSTEM当前系统的名称和版本,为 CMAKE_SYSTEM_NAME 和 CMAKE_SYSTEM_VERSION 的组合,比如:Linux-4.18.0-277.el8.x86_64
CMAKE_SYSTEM_NAME不包含版本的系统名称,比如 set(CMAKE_SYSTEM_NAME Linux);该指令必须存在,其目的是设置目标机使用的操作系统名称,支持Linux,QNX,WindowsCE,Android等。如果没有操作系统,那么就写 Generic。执行该指令后,cmake 变量CMAKE_CROSSCOMPILING 会自动被设置为 TRUE,此时 cmake 就会“知道“现在执行的是交叉编译
CMAKE_HOST_SYSTEMCMake 构建时使用的系统的名称和版本
CMAKE_HOST_SYSTEM_NAME构建 CMake 时使用的系统名称,与 CMAKE_SYSTEM_NAME 类似,但适用于交叉编译。
­CMAKE_SYSTEM_VERSION系统版本,比如4.18.0-277.el8.x86_64
CMAKE_SYSTEM_PROCESSOR可选项,当前正在为其构建的CPU的名称,例如 set(CMAKE_SYSTEM_PROCESSOR arm);当不交叉编译时,此变量与 CMAKE_HOST_SYSTEM_PROCESSOR 变量具有相同的值;只有在目标程序要运行在不同硬件平台时候才需要进行设置针对不同的对象。它可以被用来做一些编译器编译选项的快速设定。
CMAKE_HOST_SYSTEM_PROCESSOR当前运行的CPUCMake的名称
CMAKE_CROSSCOMPILING如果当前构建是交叉编译,则此变量值为真
CMAKE_FIND_ROOT_PATH在交叉编译时,用于寻找目标系统上支持库和头文件的路径
CMAKE_SIZEOF_VOID_PCMake 编译器检测到的目标体系结构的 void * 的大小(例如为 4 或者 8),可用于确定是 32 位还是 64 位系统

五、平台变量

变量功能
WIN32当目标系统是 Windows(包括 Win64)时设置为True
UNIX如果当前系统是 Unix 类似系统(包括 Linux,macOS 和其他 Unix 系统),则此变量值为True
APPLE如果当前系统是基于 Apple 的操作系统(如 macOS),则此变量值为True
CYGWIN如果当前系统是 CygwinWindows 上运行的 Unix 类似环境),此变量值为True
MINGW如果当前系统使用 MinGW 编译器(适用于 Windows),此变量值为True
MSVC如果当前构建使用 Microsoft Visual C++ 编译器,则此变量值为True

六、特殊变量

变量功能
CMAKE_VERSIONCMake的版本
BUILD_SHARED_LIBS一个布尔变量,用于控制默认链接库的类型(静态或动态),用来控制默认的库编译方式,如果不进行设置,使用 add_library 又没有指定库类型的情况下,默认编译生成的库都是静态库

注意:如果 set(BUILD_SHARED_LIBS ON) 后,默认生成的为动态库。


Linux二进制 Linux编程、内核模块、网络原创文章分享,欢迎关注"Linux二进制"微信公众号
评论
  • 百佳泰特为您整理2025年1月各大Logo的最新规格信息,本月有更新信息的logo有HDMI、Wi-Fi、Bluetooth、DisplayHDR、ClearMR、Intel EVO。HDMI®▶ 2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新规范将支持更高的分辨率和刷新率,并提供更多高质量选项。更快的96Gbps 带宽可满足数据密集型沉浸式和虚拟应用对传输的要求,如 AR/VR/MR、空间现实和光场显示,以及各种商业应用,如大型数字标牌、医疗成像和
    百佳泰测试实验室 2025-01-16 15:41 189浏览
  • 电竞鼠标应用环境与客户需求电竞行业近年来发展迅速,「鼠标延迟」已成为决定游戏体验与比赛结果的关键因素。从技术角度来看,传统鼠标的延迟大约为20毫秒,入门级电竞鼠标通常为5毫秒,而高阶电竞鼠标的延迟可降低至仅2毫秒。这些差异看似微小,但在竞技激烈的游戏中,尤其在对反应和速度要求极高的场景中,每一毫秒的优化都可能带来致胜的优势。电竞比赛的普及促使玩家更加渴望降低鼠标延迟以提升竞技表现。他们希望通过精确的测试,了解不同操作系统与设定对延迟的具体影响,并寻求最佳配置方案来获得竞技优势。这样的需求推动市场
    百佳泰测试实验室 2025-01-16 15:45 310浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 152浏览
  • 80,000人到访的国际大展上,艾迈斯欧司朗有哪些亮点?感未来,光无限。近日,在慕尼黑electronica 2024现场,ams OSRAM通过多款创新DEMO展示,以及数场前瞻洞察分享,全面展示自身融合传感器、发射器及集成电路技术,精准捕捉并呈现环境信息的卓越能力。同时,ams OSRAM通过展会期间与客户、用户等行业人士,以及媒体朋友的深度交流,向业界传达其以光电技术为笔、以创新为墨,书写智能未来的深度思考。electronica 2024electronica 2024构建了一个高度国际
    艾迈斯欧司朗 2025-01-16 20:45 187浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 117浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 57浏览
  • 随着消费者对汽车驾乘体验的要求不断攀升,汽车照明系统作为确保道路安全、提升驾驶体验以及实现车辆与环境交互的重要组成,日益受到业界的高度重视。近日,2024 DVN(上海)国际汽车照明研讨会圆满落幕。作为照明与传感创新的全球领导者,艾迈斯欧司朗受邀参与主题演讲,并现场展示了其多项前沿技术。本届研讨会汇聚来自全球各地400余名汽车、照明、光源及Tier 2供应商的专业人士及专家共聚一堂。在研讨会第一环节中,艾迈斯欧司朗系统解决方案工程副总裁 Joachim Reill以深厚的专业素养,主持该环节多位
    艾迈斯欧司朗 2025-01-16 20:51 146浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 118浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 205浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 84浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦