CMake 小知识:CMAKE_INSTALL_PREFIX 与 option 变量的覆盖规则

ops/2025/2/10 13:05:19/

1、CMAKE_INSTALL_PREFIX:安装路径的设置与使用

1.1、什么是CMAKE_INSTALL_PREFIX

CMAKE_INSTALL_PREFIX 是 CMake 中用于指定项目安装路径的变量。当我们使用 make install 或 cmake --install 命令时,生成的文件(如可执行文件、库文件、头文件等)会被安装到 CMAKE_INSTALL_PREFIX 指定的目录中。

  • 在 Linux/macOS 上,CMAKE_INSTALL_PREFIX 的默认值是 /usr/local
  • 在 Windows 上,默认值通常是 C:/Program Files/${PROJECT_NAME}

1.2、如何设置CMAKE_INSTALL_PREFIX

  • 在命令行中设置
cmake -B build -DCMAKE_INSTALL_PREFIX=/path/to/install
  • 在CMakeLists.txt中设置
set(CMAKE_INSTALL_PREFIX "/path/to/install")

1.3、使用CMAKE_INSTALL_PREFIX

如果设置了CMAKE_INSTALL_PREFIX路径,

install(TARGETS my_target DESTINATION bin)
install(FILES my_header.h DESTINATION include)

上述代码会将 my_target 安装到 ${CMAKE_INSTALL_PREFIX}/bin,将 my_header.h 安装到 ${CMAKE_INSTALL_PREFIX}/include。

  • CMAKE_INSTALL_PREFIX 的设置应尽量在配置阶段完成,避免在构建阶段修改。
  • 如果未显式设置 CMAKE_INSTALL_PREFIX,CMake 会使用默认值。

2、option 定义变量时,不同级别 CMakeLists.txt 中的覆盖规则

option 是 CMake 中用于定义布尔变量的命令,通常用于控制编译选项或功能开关。在 CMake 项目中,可能存在多个 CMakeLists.txt 文件(例如,根目录和子目录中各有一个)。如果在不同级别的 CMakeLists.txt 中定义了同名的 option 变量,它们的值会如何覆盖呢?覆盖的规则如下:

  • 父目录的 option 优先于子目录:如果在父目录的 CMakeLists.txt 中定义了 option,子目录中的同名 option 不会覆盖父目录的值。
# 父目录 CMakeLists.txt
option(ENABLE_FEATURE "Enable feature in parent" ON)# 子目录 CMakeLists.txt
option(ENABLE_FEATURE "Enable feature in child" OFF)

最终 ENABLE_FEATURE 的值是 ON,因为父目录的定义优先。

  • 命令行参数可以覆盖所有 option:
    如果在命令行中通过 -D 指定了 option 的值,它会覆盖所有 CMakeLists.txt 中的定义。
cmake -B build -DENABLE_FEATURE=OFF

无论 CMakeLists.txt 中如何定义 ENABLE_FEATURE,最终值都是 OFF。

  • set 命令可以覆盖 option:
    如果在 CMakeLists.txt 中使用 set 命令显式设置 option 变量,它会覆盖 option 的定义。
option(ENABLE_FEATURE "Enable feature" ON)
set(ENABLE_FEATURE OFF)

最终 ENABLE_FEATURE 的值是 OFF。

2.1、option使用示例

假设项目结构如下:

project/
├── CMakeLists.txt
└── subdir/└── CMakeLists.txt
  • 父目录 CMakeLists.txt:
option(ENABLE_FEATURE "Enable feature in parent" ON)
  • 子目录 CMakeLists.txt:
option(ENABLE_FEATURE "Enable feature in child" OFF)
  • 命令行调用:
cmake -B build -DENABLE_FEATURE=ON

最终 ENABLE_FEATURE 的值是 ON,因为命令行参数优先级最高。

3、总结

  • CMAKE_INSTALL_PREFIX 是 CMake 中用于指定安装路径的变量,可以通过命令行、CMakeLists.txt设置。合理使用它可以方便地管理项目的安装目录。
  • option 变量的覆盖规则:父目录的 option 优先于子目录;命令行参数可以覆盖所有 CMakeLists.txt 中的 option;set 命令可以覆盖 option 的定义

http://www.ppmy.cn/ops/157252.html

相关文章

AIGC-辅助小说(斗破苍穹为例)创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

动手学图神经网络(10):利用 PyTorch Geometric 进行图分类

利用 PyTorch Geometric 进行图分类 本文将详细介绍如何使用 PyTorch Geometric 库进行图分类任务,同时结合 Weights & Biases(W&B)工具对实验进行跟踪和可视化。 环境设置 首先, 需要安装一些必要的库,包括 PyTorch Geometric 用于实现图神经网络,plotly 用于…

DeepSeek-R1系列(1.5b/7b/8b/32b/70b/761b)大模型部署需要什么硬件条件

一、轻量级模型(1.5B-7B参数) 1.5B模型 CPU:最低4核(推荐Intel/AMD多核处理器) 内存:8GB+(纯CPU推理) 显卡:非必需,若需加速可选4GB+显存(如GTX 1650) 存储:3GB+(模型文件约1.5-2GB) 适用场景:低资源设备(如树莓派、旧笔记本)、简单文本生成或物联网设备 7B模…

C++ Primer 逗号运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器,其特点是…

CSGHub高效管理|解锁DeepSeek R1蒸馏模型 :高效推理的新选择

在大模型的新时代,如何在保持高推理能力的同时降低计算成本,已经成为企业和开发者们关注的核心问题。 你是否也在寻找一个既强大又高效的AI模型? DeepSeek R1,作为目前领先的AI模型之一,不仅推出了强大的671B参数旗舰模…

34.日常算法

1.合并区间 题目来源 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入&#x…

保姆级教程Docker部署Zookeeper模式的Kafka镜像

目录 一、安装Docker及可视化工具 二、Docker部署Zookeeper 三、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 5、验证生产消费 四、部署可视化工具 1、创建挂载目录 2、Compose运行Kafka-eagle容器 3、查看Kafka-e…