簡體   English   中英

CMake:何時使用 add_definitions 而不是 set_target_properties(目標 PROPERTIES COMPILE_DEFINITIONS 定義)

[英]CMake: when to use add_definitions instead of set_target_properties(target PROPERTIES COMPILE_DEFINITIONS definitions)

在 CMake 文檔中,我們可以閱讀:

添加定義

為當前目錄及以下目錄中的源代碼向編譯器命令行添加標志。

目錄上的 COMPILE_DEFINITIONS 屬性

COMPILE_DEFINITIONS:用於編譯目錄源的預處理器定義。

目標上的 COMPILE_DEFINITIONS 屬性

COMPILE_DEFINITIONS:用於編譯目標源的預處理器定義。

源文件的 COMPILE_DEFINITIONS 屬性

COMPILE_DEFINITIONS:用於編譯源文件的預處理器定義。

COMPILE_DEFINITIONSadd_definitions功能似乎重疊。 COMPILE_DEFINITIONS屬性似乎更靈活。

因此,似乎 COMPILE_DEFINITIONS 屬性可以完成 add_definitions 所做的一切,甚至更多。

那么,在哪些情況下我們必須調用 add_definitions 因為不能使用 COMPILE_DEFINITIONS 屬性?

自從十多年前 CMake 的第一個版本上線以來,CMake 中就已經存在add_definitions了。

COMPILE_DEFINITIONS只是更新、更靈活和更細粒度的方法。

它們將始終存在:由於世界上 99% 以上的現有CMakeLists.txt文件使用add_definitions ,因此刪除它是不明智的。 CMake 開發人員非常努力地保持向后兼容性……有時會損害清晰度和簡單性。 有時以多種不同的方式做本質上相同的事情。

所以: add_definitions主要用於配置預先存在的 CMakeLists 文件——對於那些在引入COMPILE_DEFINITIONS之前就已經存在的項目。 而且,由於這些項目使用它,任何基於人們從閱讀這些 CMakeLists 文件中學到的知識的新項目也很可能使用add_definitions

但是如果單獨使用COMPILE_DEFINITIONS就足以滿足您的需求,那肯定沒有錯。

如果你想compile definition for target添加compile definition for target ,你可以使用這個函數target_compile_definitions更方便,比如一次添加多個compile definitions ,比如:

add_executable (trie_io_test demo12.cpp)
target_compile_definitions(trie_io_test PRIVATE UNIT_TESTING=1 IO_TEST=1)

您也可以從這個https://cmake.org/cmake/help/v3.0/command/target_compile_definitions.html看到這個問題如何為目標可執行文件設置多個編譯定義以獲取更多信息。

我不是說必須使用某些東西。

這只是你的習慣問題。

一些建議:

  • 當您想為當前目錄及以下目錄中的源添加到編譯器命令行時,請使用add_definitions 打字時間更短。

  • 使用COMPILE_DEFINITIONS對目標或特定源進行微調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM