CMake3.16下add_definitions定义的宏子目录无法检测如何解决
问题原因
你混淆了CMake变量和C/C++预处理器定义的作用范围:
add_definitions(-DAPP_ROLE_IS_QT)命令的作用是给C/C++编译器添加预处理器定义,这个定义只会在源码编译阶段传递给编译器,不会创建同名的CMake变量。if(DEFINED <参数>)判断的是当前CMake上下文中是否存在同名的CMake变量,自然永远返回假。
解决方法
根据使用场景有两种可选方案:
方案1(推荐):先定义CMake变量,再同步为预处理器定义
同时满足CMake逻辑判断和编译期预处理器定义的需求,还能避免全局编译选项污染:
- 主目录CMakeLists.txt修改为:
# 定义CMake变量,作用域默认覆盖主目录及所有子目录 set(APP_ROLE_IS_QT ON CACHE INTERNAL "App role config" FORCE) # 将变量同步为预处理器定义传递给编译器 # 更推荐绑定到具体目标,避免全局污染 target_compile_definitions(你的项目目标名 PUBLIC -DAPP_ROLE_IS_QT) # 如果你确实需要全局生效也可以保留原有add_definitions写法 # add_definitions(-DAPP_ROLE_IS_QT)
- 子目录的CMakeLists中原有的判断逻辑不需要修改,即可正常生效。
方案2(临时排查用):直接匹配编译选项
如果你不想额外定义CMake变量,也可以直接判断全局编译选项中是否包含对应定义标识:
if(CMAKE_CXX_FLAGS MATCHES "-DAPP_ROLE_IS_QT" OR CMAKE_C_FLAGS MATCHES "-DAPP_ROLE_IS_QT") message(STATUS "It exists.") # 对应逻辑 else() message(STATUS "It doesn't!!") # 其他逻辑 endif()
该方式耦合性高,不推荐在正式项目中使用。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

