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
英文地址,請注明出處:http://en.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…