CMake set_source_files_properties使用解析

set_source_files_properties() 是 CMake 中用于精细化控制源文件属性的多功能命令。除了设置编译标志外,它还有许多其他重要用途。以下是全面的用法解析:


一、核心功能分类

1. 编译控制
  • 编译器选项COMPILE_FLAGS / COMPILE_OPTIONS
    set_source_files_properties(src.c PROPERTIES COMPILE_OPTIONS "-O0;-Wall")
    
  • 语言标准C_STANDARD / CXX_STANDARD
    set_source_files_properties(legacy.cpp PROPERTIES CXX_STANDARD 98)
    
2. 依赖管理
  • 显式依赖OBJECT_DEPENDS
    set_source_files_properties(main.c PROPERTIES OBJECT_DEPENDS "version.h")
    
  • 生成依赖GENERATED(标记自动生成的文件)
    set_source_files_properties(autogen.c PROPERTIES GENERATED TRUE)
    
3. 输出控制
  • 对象文件命名OUTPUT_NAME
    set_source_files_properties(module.c PROPERTIES OUTPUT_NAME "custom_module")
    
  • 汇编输出EXTERNAL_OBJECT(链接预编译对象)
    set_source_files_properties(precompiled.o PROPERTIES EXTERNAL_OBJECT TRUE)
    
4. 位置控制
  • 头文件标记HEADER_FILE_ONLY
    set_source_files_properties(config.h PROPERTIES HEADER_FILE_ONLY TRUE)
    

二、高级用法详解

1. 条件编译控制
# 仅对特定编译器生效
set_source_files_properties(optimized.c PROPERTIES COMPILE_OPTIONS "$<$<CXX_COMPILER_ID:GNU>:-Ofast>"
)# 根据构建类型设置
set_source_files_properties(debug.c PROPERTIESCOMPILE_OPTIONS "$<$<CONFIG:Debug>:-DDEBUG_MODE>"
)
2. 多配置管理
# 为不同配置指定不同源文件
set_source_files_properties(impl_win.c PROPERTIES COMPILE_DEFINITIONS "OS_WINDOWS")
set_source_files_properties(impl_linux.c PROPERTIES COMPILE_DEFINITIONS "OS_LINUX")
3. 混合语言支持
# 强制指定文件语言(覆盖扩展名检测)
set_source_files_properties(asm_code.s PROPERTIES LANGUAGE C)# CUDA文件特殊处理
set_source_files_properties(kernel.cu PROPERTIES CUDA_ARCHITECTURES "75")
4. 符号可见性
# 控制特定文件的符号导出
set_source_files_properties(internal.c PROPERTIES C_VISIBILITY_PRESET hidden)

三、实际应用场景

场景 1:嵌入式系统内存优化
# 关键驱动文件禁用栈保护
set_source_files_properties(driver_*.c PROPERTIESCOMPILE_OPTIONS "-fno-stack-protector"
)# 低内存区域文件使用特殊段
set_source_files_properties(lowmem.c PROPERTIESCOMPILE_FLAGS "-mlowmem-section"OUTPUT_NAME "lowmem_section"
)
场景 2:跨平台兼容处理
if(WIN32)set_source_files_properties(win_impl.cpp PROPERTIES SKIP_UNITY_BUILD ON)
else()set_source_files_properties(linux_impl.cpp PROPERTIES SKIP_AUTOMOC ON)
endif()
场景 3:安全关键代码强化
# 安全认证要求的独立编译
set_source_files_properties(safety_critical.c PROPERTIESCOMPILE_OPTIONS "-fPIC -pedantic -Werror"C_STANDARD 11C_EXTENSIONS OFF
)

四、现代 CMake 替代方案

虽然功能强大,但现代 CMake 更推荐目标级控制:

# 替代 set_source_files_properties 的现代写法
target_compile_definitions(my_lib PRIVATE $<TARGET_PROPERTY:MY_SPECIAL_DEFS>
)target_sources(my_lib PRIVATE$<${condition}:special_file.cpp>
)

何时使用文件级属性
当存在以下需求时仍需要文件级控制:

  1. 同一目标内不同文件的差异化处理
  2. 自动生成文件的特殊标记
  3. 与遗留构建系统交互
  4. 编译器特性文件级开关

五、特殊属性参考表

属性名作用描述示例值
COMPILE_DEFINITIONS文件专属宏定义“DEBUG=1;VERSION=2”
INCLUDE_DIRECTORIES文件专属包含路径“/opt/local/include”
SKIP_PRECOMPILE_HEADERS跳过预编译头ON/OFF
SKIP_UNITY_BUILD排除Unity构建TRUE
SYMBOLIC标记符号链接文件YES
AUTOUIC_OPTIONSQt uic编译器选项“no-protection”

最佳实践建议

  1. 优先使用目标级命令:90% 场景应使用 target_compile_options()
  2. 属性继承原则:文件属性覆盖目标属性
  3. 作用域限制:使用 DIRECTORY 参数限定搜索路径
  4. 调试工具:查看最终属性值
    cmake --build . --target help | grep -A 10 "Source files"
    

通过合理使用这些特性,可在保持构建系统整洁的同时实现高度定制化的构建需求。


补充解释 set_source_files_properties 的所有参数含义和用法:


set_source_files_properties 完整参数解析

命令基本结构:
set_source_files_properties(<files>...[DIRECTORY <dirs>...][TARGET_DIRECTORY <targets>...]PROPERTIES <prop1> <value1> [<prop2> <value2>]...
)

1. 核心参数详解

(1) <files> - 目标文件列表
  • 作用:指定要设置属性的源文件
  • 格式
    set_source_files_properties(file1.c file2.cpp ...)
    
  • 注意事项
    • 支持相对路径/绝对路径
    • 支持通配符(如 *.c),但需配合 file(GLOB) 使用
    • 示例:${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
(2) DIRECTORY <dirs> - 文件搜索目录
  • 作用:指定源文件所在的根目录
  • 格式
    DIRECTORY path1 [path2 ...]
    
  • 实际应用
    # 设置上级目录中文件属性
    set_source_files_properties(lfs_vfs.c DIRECTORY ..PROPERTIES COMPILE_FLAGS -finstrument-functions
    )
    
  • 工作原理
    当前CMakeLists.txt
    DIRECTORY ..
    定位文件: ../lfs_vfs.c
    应用属性
(3) TARGET_DIRECTORY <targets> (CMake 3.13+)
  • 作用:关联目标所在的目录
  • 使用场景:当文件被多个目标使用时
  • 示例
    set_source_files_properties(common.cTARGET_DIRECTORY lib1 lib2PROPERTIES COMPILE_DEFINITIONS "SHARED_LOGIC"
    )
    
(4) PROPERTIES - 属性键值对
  • 结构<属性名> <属性值> 的列表
  • 常见属性
    属性名作用示例值
    COMPILE_FLAGS编译器选项-O0 -g
    COMPILE_DEFINITIONS预处理器宏定义"DEBUG=1;VERSION=2"
    INCLUDE_DIRECTORIES专属头文件搜索路径"/opt/local/include"
    GENERATED标记为生成文件TRUE
    SKIP_LINTING跳过代码检查工具ON
    LANGUAGE覆盖语言检测"CXX"

2. DIRECTORY 参数深度解析

为什么需要 DIRECTORY?

当项目结构复杂时:

project/
├── CMakeLists.txt          # 根目录
├── src/
│   ├── CMakeLists.txt
│   └── module/
│       └── impl.c         # 目标文件
└── tests/└── CMakeLists.txt      # 需要设置 impl.c 属性

tests/CMakeLists.txt 中:

# 错误写法(文件不存在于当前目录)
set_source_files_properties(impl.c ...)# 正确写法
set_source_files_properties(impl.cDIRECTORY ${CMAKE_SOURCE_DIR}/src/modulePROPERTIES ...
)
路径解析规则:
  1. 当指定 DIRECTORY 时:

    • 文件路径 = DIRECTORY路径 + / + <files> 中的路径
  2. 未指定 DIRECTORY 时:

    • 默认使用 CMAKE_CURRENT_SOURCE_DIR
多目录支持:
set_source_files_properties(file1.c file2.cDIRECTORY ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/libPROPERTIES ...
)

3. 典型应用场景演示

场景 1:多位置文件统一设置
# 设置所有平台的抽象层实现
set_source_files_properties(abstract_unix.cabstract_win.cabstract_macos.cDIRECTORY ${CMAKE_SOURCE_DIR}/src/os${CMAKE_SOURCE_DIR}/backportsPROPERTIESCOMPILE_DEFINITIONS "CROSS_PLATFORM"COMPILE_OPTIONS "-Wall -Werror"
)
场景 2:生成文件特殊处理
# 配置自动生成的协议文件
add_custom_command(OUTPUT protocol.pb.cCOMMAND protoc --c_out=. protocol.proto
)set_source_files_properties(protocol.pb.cPROPERTIESGENERATED TRUE              # 标记为生成文件SKIP_AUTOMOC TRUE           # 跳过Qt的moc处理COMPILE_OPTIONS "-Wno-unused-function"
)
场景 3:安全关键代码强化
set_source_files_properties(safety_critical.cDIRECTORY drivers/PROPERTIESCOMPILE_FLAGS "-fstack-protector-strong -fsanitize=safe-stack"COMPILE_DEFINITIONS "SAFETY_LEVEL=3"C_STANDARD 11
)

4. 现代 CMake 替代方案对比

场景传统文件属性写法现代目标属性写法
编译器选项set_source_files_properties(... COMPILE_FLAGS)target_compile_options(target PRIVATE ...)
宏定义set_source_files_properties(... COMPILE_DEFINITIONS)target_compile_definitions(target PRIVATE ...)
头文件路径set_source_files_properties(... INCLUDE_DIRECTORIES)target_include_directories(target PRIVATE ...)
语言标准set_source_files_properties(... CXX_STANDARD)set_target_properties(target PROPERTIES CXX_STANDARD 11)

何时必须使用文件属性

  1. 同一目标中不同文件需要不同设置
  2. 自动生成文件的特殊标记
  3. 需要覆盖目标级设置的特定文件
  4. 处理不在当前作用域的文件

5. 调试技巧

查看文件最终属性:

# 打印文件属性
get_source_file_property(result lfs_vfs.c COMPILE_FLAGS)
message("Flags: ${result}")

生成系统探查:

# 查看生成的文件编译命令
cmake --build . --verbose

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

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

相关文章

雷达微多普勒特征代表运动中“事物”的运动部件。

雷达微多普勒特征代表运动中“事物”的运动部件。 即使一个人在椅子上来回摇晃&#xff0c;肉眼看来这个动作也很简单。但对雷达来说&#xff0c;这是微动作的丰富混合&#xff1a;移动膝盖和腿、摆动手臂&#xff0c;甚至是倾斜的椅子。所有这些都会产生独特但复杂的微多普勒特…

FreeRTOS硬件中断发生时的现场

在FreeRTOS中&#xff0c;当硬件中断发生时&#xff0c;当前正在运行的任务会立即被挂起&#xff0c;处理器会跳转到中断相关的中断服务程序中&#xff0c;在中断服务程序执行期间&#xff0c;遵循以下规则&#xff1a;1、中断独占CPU&#xff0c;ISR拥有最高的执行优先级&…

kotlin语法和特性分析

核心设计哲学&#xff1a; 简洁 (Concise): 减少样板代码&#xff08;如 getter/setter、类型推导&#xff09;&#xff0c;让代码表达更直接。安全 (Safe): 从语言层面设计来避免常见错误&#xff08;尤其是空指针异常&#xff09;。互操作性 (Interoperable): 与 Java 无缝集…

二进制数本身没有默认的有符号或无符号解释

文章目录1. ​**​硬件层面&#xff1a;CPU 不区分有符号/无符号​**​2. ​**​解释权在程序员手中​**​3. ​**​默认倾向性&#xff08;非绝对规则&#xff09;​**​4. ​**​如何避免混淆&#xff1f;​**​5. ​**​经典示例​**​总结1. **解释为无符号数&#xff08;U…

(AI) Server (Hardware) Architecture

Overview by Atlas T800 Just found a good product demo. from Huawei for its Atlas T800, here 计算产品3D展示 First turn off all modules and we can delve into how this server is organized. Core This is an AI server with 910B as its main feature, which is …

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论数据可视化分析-用户评论词云图实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解微博评论数据可视化分析-用户评论词云图实现…

【Linux学习|黑马笔记|Day1】Linux初识、安装VMware Workstation、安装CentOS7、远程连接、虚拟机快照

Linux DAY1 前言 因为之前MySQL学到安装Linux版本的MySQL了&#xff0c;需要安装虚拟机等等&#xff0c;所以我打算先学完Linux的全部课程&#xff0c;期间继续学MySQL 文章目录Linux DAY1一.1&#xff09;操作系统概述2&#xff09;Linux初识3&#xff09;虚拟机4.1&#xff…

编程与数学 03-002 计算机网络 13_无线网络技术

编程与数学 03-002 计算机网络 13_无线网络技术一、无线网络的基本概念&#xff08;一&#xff09;无线通信的频段与标准&#xff08;二&#xff09;无线网络的优势与挑战二、无线局域网&#xff08;WLAN&#xff09;&#xff08;一&#xff09;802.11标准系列&#xff08;二&a…

肖特基二极管MBR0540T1G 安森美ON 低电压 高频率 集成电路IC 芯片

MBR0540T1G ON Semiconductor&#xff1a;超低VF肖特基二极管&#xff0c;重新定义电源效率&#xff01;&#x1f525; 一、产品简介 MBR0540T1G 是安森美&#xff08;ON Semiconductor&#xff09;推出的0.5A/40V肖特基势垒二极管&#xff0c;采用专利沟槽结构&#xff0c;专…

windows内核研究(软件调试-调试事件采集)

软件调试调试事件采集前面有说到在调试器和被调试之间会创建一个_DEBUG_OBJECT对象来进行关联调试事件的种类 被调试进程会把一个个的调试事件写到_DEBUG_OBJECT中的一个成员链表中&#xff0c;调试器就通过它们建立的 _DEBUG_OBJECT调试对象获取调式事件&#xff0c;但并不是进…

Web开发-PHP应用组件框架前端模版渲染三方插件富文本编辑器CVE审计

类别组件/框架说明[Web框架]Laravel现代化、功能全面的框架&#xff0c;适合大多数Web应用。Symfony高度模块化、功能强大的框架&#xff0c;适合复杂应用。CodeIgniter轻量级框架&#xff0c;适合快速开发。Zend Framework (Laminas)企业级框架&#xff0c;适合大规模应用&…

Spring Boot Actuator 保姆级教程

1. 引言 Spring Boot Actuator 是一个功能强大的监控工具&#xff0c;能够帮助开发者监控和管理应用的运行状态。通过 Actuator&#xff0c;我们可以轻松获取应用的健康状况、配置信息、性能指标等。本文将一步步引导你如何配置和使用 Actuator&#xff0c;以及如何通过它来监控…

使用 whisper, 音频分割, 初步尝试,切割为小块,效果还不错 1

对于一首歌而言,如何断句?即,一个 mp4 或是 mp3 文件,或是一段录音, 如何使用程序,或是 ai 来断句。分割为一句一句的片段??如果人工来分割,一般是使用 capcut 之类的剪辑软件。但是效率太慢了。所以我想能否设计一个简洁的,自动的程序来处理。这种事情,专业的名称…

AD2S1210的DOS LOT含义

一、​​信号质量监控类寄存器​​​​LOT阈值&#xff08;0x88&#xff09;​​​​作用​​&#xff1a;设定信号丢失&#xff08;Loss of Signal&#xff09;的判定门槛。​​场景​​&#xff1a;当正弦或余弦输入信号幅值低于此值时&#xff0c;芯片认为信号丢失&#xff…

Au速成班-多轨编辑流程

基础编辑工作流&#xff0c;包含文件导入&#xff0c;导出&#xff0c;音量调节&#xff0c;部分效果添加。 创建多轨会话 设置工程文件名称、文件位置、采样率、位深度、主控等。 界面管理 &#xff0c;界面说明详细可看 Au速成班-基础篇_au界面介绍-CSDN博客 音量调节点击…

Rust实现GPU驱动的2D渲染引擎

当传统CPU渲染遭遇性能瓶颈时&#xff0c;GPU驱动的架构正在革新2D图形领域。本文将深入解析用Rust编写的​​完全GPU驱动的2D渲染引擎Vello​​&#xff0c;揭秘其如何通过并行计算实现丝滑渲染。 一、GPU Driven革命&#xff1a;为何是Vello&#xff1f; 传统渲染的瓶颈 传…

【ELasticsearch】温、冷数据节点能是同一个节点吗

温、冷数据节点能是同一个节点吗1.节点角色与分层存储原理2.一个节点能否同时是 “温” 和 “冷” 节点 &#xff1f;3.为什么通常不是最佳实践 &#xff1f;4.可能的适用场景&#xff08;非常有限&#xff09;5.结论在 Elasticsearch 中&#xff0c;理论上&#xff0c;一个物理…

报错:selenium.common.exceptions.ElementNotInteractableException: Message

针对该错误&#xff0c;以下是分步解决方案&#xff1a; 1. 显式等待确保元素可交互 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC# 等待元素可点…

sqli-labs:Less-10关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $id ".$id."; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入类型&#xff1a;字符串型&#xff08;双引号包裹&#xff09;提示&#xff1a;参数id需以"闭合 php回显输出语句的代码如…

imx6ull-驱动开发篇5——新字符设备驱动实验

目录 前言 新字符设备驱动原理 申请设备号 注册设备号 释放设备号 注册方法 字符设备结构cdev cdev_init 函数 cdev_add 函数 cdev_del 函数 自动创建设备节点 mdev 机制 类创建函数 类删除函数 创建设备函数 删除设备函数 设置文件私有数据 实验程序编写 l…