当前位置: 首页 > news >正文

苏州 做网站有口碑的网站建设

苏州 做网站,有口碑的网站建设,seo排名哪家公司好,深圳动力网站设计公司目录 1.简介 2.常见用法 3.与其他指令的对比 4.局限性 5.使用建议 6.总结 1.简介 add_definitions 命令在CMake中用于向编译器添加预处理器宏定义‌,翻译成中文可以理解为“添加定义”或“添加预处理器定义”。这个命令通过添加-D标志来定义宏(如 …

目录

1.简介

2.常见用法

3.与其他指令的对比

4.局限性

5.使用建议

6.总结


1.简介

        add_definitions 命令在CMake中用于向编译器添加预处理器宏定义‌,翻译成中文可以理解为“添加定义”或“添加预处理器定义”。这个命令通过添加-D标志来定义宏(如 g++ -DDEBUG)。这些宏可以在编译源文件时使用,以便在代码中进行条件编译或设置特定的编译选项‌。这些宏会作用于当前目录及所有子目录的所有目标(包括可执行文件和库)。
    基本语法:

add_definitions(-DDEFINITION1 -DDEFINITION2 ...)
  • -D 前缀:必须显式指定,用于定义宏(类似编译器命令行参数)。
  • 宏值:若未指定值,默认值为 1(如 -DDEBUG 等价于 #define DEBUG 1)。

2.常见用法

1.定义简单宏

add_definitions(-DDEBUG)  # 等价于 #define DEBUG 1
add_definitions(-DVERSION=\"1.0.0\")  # 等价于 #define VERSION "1.0.0"

2.条件定义

if(WIN32)add_definitions(-DWINDOWS)  # Windows 平台专用宏
elseif(APPLE)add_definitions(-DMACOS)    # macOS 平台专用宏
else()add_definitions(-DLINUX)    # Linux 平台专用宏
endif()

3.传递 CMake 变量到源代码

set(PROJECT_VERSION "1.2.3")
add_definitions(-DPROJECT_VERSION="${PROJECT_VERSION}")  # 将 CMake 变量传递给源码

源码中就可以这样引用:

#include <iostream>int main() {std::cout << "*** test begin ***" << std::endl;#ifdef PROJECT_VERSIONstd::cout << "PROJECT_VERSION= " << PROJECT_VERSION<< std::endl;
#endifstd::cout << "*** test end ***" << std::endl;return 0;
}

3.与其他指令的对比

指令作用范围推荐场景
add_definitions全局(当前目录及所有子目录)项目全局需要的宏(如平台相关定义)
target_compile_definitions仅针对指定目标为特定目标设置私有或公共宏
set(CMAKE_C_FLAGS ...)全局编译选项直接修改编译器标志(不推荐优先使用)

add_definitions与target_compile_definitions详细区别:

核心区别对比

特性add_definitionstarget_compile_definitions
作用范围全局(当前目录及所有子目录)仅针对指定目标(如 add_executable 或 add_library 定义的目标)
作用域控制无(所有目标强制继承)支持 PRIVATE/PUBLIC/INTERFACE 精细控制
传递性自动传递给所有依赖项仅 PUBLIC/INTERFACE 属性传递给依赖项
现代 CMake 推荐度不推荐(旧版指令)推荐(更灵活、更安全)
典型场景项目全局宏(如平台定义)为特定目标设置私有或公共宏

1.add_definitions:全局定义宏

  • 功能:为当前目录及所有子目录中的所有目标添加预处理器宏。
  • 缺点:缺乏作用域控制,可能导致宏冲突(如不同库需要同名但不同值的宏)。

示例:

add_definitions(-DDEBUG)  # 全局定义 DEBUG 宏add_executable(my_app main.cpp)
add_library(my_lib STATIC lib.cpp)# 结果:my_app 和 my_lib 都将定义 DEBUG 宏

2.target_compile_definitions:目标级宏控制

  • 功能:为特定目标添加预处理器宏,并支持通过 PRIVATE/PUBLIC/INTERFACE 控制宏的传递性。
  • 优势:避免全局污染,精确控制哪些宏被传递给依赖项。

示例:

add_library(my_lib STATIC lib.cpp)
target_compile_definitions(my_libPRIVATE -DENABLE_INTERNAL_LOGGING  # 仅 my_lib 可见PUBLIC -DUSE_MY_LIB_API=1          # my_lib 和依赖它的目标可见
)add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE my_lib)  # my_app 继承 USE_MY_LIB_API 宏# 结果:
# - my_lib 同时定义 ENABLE_INTERNAL_LOGGING 和 USE_MY_LIB_API
# - my_app 仅定义 USE_MY_LIB_API(不继承 ENABLE_INTERNAL_LOGGING)

3.传递性对比

add_definitions 的隐式传递

add_definitions(-DVERSION="1.0.0")  # 全局定义add_library(my_lib STATIC lib.cpp)
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE my_lib)# 结果:
# - my_lib 和 my_app 都自动定义 VERSION 宏
# - 无法控制哪些依赖项继承该宏

target_compile_definitions 的显式传递

add_library(my_lib STATIC lib.cpp)
target_compile_definitions(my_libINTERFACE -DUSE_MY_LIB=1  # 仅传递给依赖项,不用于编译 my_lib 自身
)add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE my_lib)  # my_app 继承 USE_MY_LIB 宏# 结果:
# - my_lib 自身不定义 USE_MY_LIB
# - my_app 定义 USE_MY_LIB

总结

场景推荐指令
为特定目标设置私有宏target_compile_definitions(... PRIVATE ...)
为特定目标设置公共宏(传递给依赖项)target_compile_definitions(... PUBLIC ...)
定义纯接口库的宏target_compile_definitions(... INTERFACE ...)
项目全局宏(如平台定义)add_definitions(谨慎使用)

4.局限性

1.全局作用域

  • 宏会应用于所有目标,可能导致意外冲突(如不同库需要同名但不同值的宏)。

2.难以控制传递性

  • 无法区分宏是 PRIVATE(仅当前目标使用)还是 PUBLIC(传递给依赖方)。

3.现代替代方案

CMake 推荐使用 target_compile_definitions 替代,因为它支持更精确的作用域控制:

# 仅对 my_target 生效,不影响其他目标
target_compile_definitions(my_target PRIVATE -DDEBUG)# 对 my_target 生效,并传递给依赖 my_target 的目标
target_compile_definitions(my_target PUBLIC -DUSE_FEATURE_X)

5.使用建议

1.优先使用 target_compile_definitions

  • 避免全局污染,提高代码可维护性。

2.仅在必要时使用 add_definitions

  • 例如,定义整个项目都需要的平台相关宏(如 _WIN32__APPLE__)。

3.避免硬编码宏值

优先通过 CMake 变量传递值,如:

set(ENABLE_LOGGING ON)
if(ENABLE_LOGGING)add_definitions(-DENABLE_LOGGING)
endif()

示例:结合 option 使用

option(ENABLE_DEBUG "Enable debug mode" OFF)if(ENABLE_DEBUG)add_definitions(-DDEBUG)  # 全局定义 DEBUG 宏
endif()add_executable(my_app main.cpp)

在代码中使用:

#ifdef DEBUG#define LOG(msg) std::cout << "[DEBUG] " << msg << std::endl
#else#define LOG(msg)
#endif

6.总结

  • 功能:全局添加预处理器宏,等效于编译器的 -D 选项。
  • 缺点:作用域不可控,可能导致宏冲突。
  • 替代方案:优先使用 target_compile_definitions 实现更精细的宏管理。

通过合理使用 add_definitions 和 target_compile_definitions,可有效控制预处理器宏的作用范围,提高项目的模块化程度。

相关链接

  • CMake 官网 CMake - Upgrade Your Software Build System
  • CMake 官方文档:CMake Tutorial — CMake 4.0.2 Documentation
  • CMake 源码:https://github.com/Kitware/CMake
  • CMake 源码:Sign in · GitLab
http://www.dtcms.com/a/590930.html

相关文章:

  • 上海网站建设口碑好网站开发工程师需要会写什么区别
  • 太原制作网站的公司哪家好网店推广新趋势
  • 网站设计需要什么证电商网站规划与设计论文
  • 数学的大厦(一):集合与顺序
  • 网站信息安全建设方案app制作价格
  • 如何通过因子库计算其生命周期内的温室气体排放量
  • php网站制作费用wordpress 显示用户名
  • 云南文投建设投资有限公司网站建设信用卡中心网站
  • 建设网站教程全集河南省建设监理协会网站
  • 蚌埠网站开发南宁优质手机网站建设公司
  • 长治网站seo想要导航页推广(推广版)
  • 东莞找公司网站wordpress登录加验证码
  • 网站申请空间网站开发税收分类
  • [nano-vllm] docs | 高性能LLM 推理引擎
  • 邢台市建设银行网站专业做轴承的网站
  • 山东恒昆建设工程有限公司网站长春电商网站建设哪家专业
  • 美团CatPaw:一款AI驱动的编程工具解析
  • 手机做任务佣金的网站上海网页制作设计营销
  • 网站备案是在哪个部门南通医院网站建设
  • 做旅游网站的设计感想南京振高建设有限公司官方网站
  • 重庆市网站编辑网站建设的视频教程
  • 如何拷贝服务器里面网站做备份陕西省住房与建设厅网站
  • 建设工程安全备案网站一个新手怎么做跨境电商
  • 卖老石器老榆木做哪个网站好商业推广软文范例
  • 怎样做钓鱼网站吉林市建设局网站
  • 自媒体网站建设秦皇岛视频优化推广
  • 私人设计网站推荐咸宁网网站
  • 天津建设公司网站网页设计教程实例项目
  • 淘客请人做网站衡阳建设网站公司
  • VB 总结