Qt如何将subdirs工程顶级pro定义的DEFINES注入到子库mylib中
问题原因
qmake的subdirs模板下,顶级项目和子项目的配置作用域是相互独立的,顶级.pro文件中定义的DEFINES默认不会传递给子项目的.pro文件,因此子项目解析配置时无法识别顶级定义的宏。
可行解决方法
方法1:使用公共.pri配置文件(最推荐,适合固定全局配置)
该方法便于统一维护全局配置,适配多子项目场景:
- 在项目根目录新建
common.pri文件,写入全局宏定义:
DEFINES += mydefine
- 在顶级
myproject.pro中引入该公共配置:
TEMPLATE = subdirs include(common.pri) SUBDIRS += \ libs/mylib \ myapp
- 在所有子项目的.pro文件(比如
mylib.pro、myapp.pro)中引入公共配置,路径根据子项目所在层级调整即可:
include($$PWD/../../common.pri) # 之后就可以正常识别mydefine做条件判断 contains(DEFINES, mydefine) { do something } else { do something else }
方法2:通过qmake命令行传递全局变量
适合需要临时开关宏的场景,执行qmake命令时直接传入宏定义,会全局作用于所有子项目:
qmake DEFINES+=mydefine
方法3:通过qmake缓存变量强制传递
如果不想修改子项目配置,可以在顶级.pro中将DEFINES写入全局缓存,子项目解析时会自动读取:
在myproject.pro中DEFINES += mydefine后添加缓存配置:
DEFINES += mydefine cache(DEFINES, add, global_project_defines)
补充说明
如果你仅需要在.pro文件中做条件判断,不需要在C/C++代码中使用该预编译宏,更推荐使用CONFIG变量做标记:
- 顶级.pro添加
CONFIG += my_feature_enabled - 子项目.pro判断
contains(CONFIG, my_feature_enabled)即可,符合qmake的常规配置习惯。
内容的提问来源于stack exchange,提问作者Fausto01
相关产品推荐
相关产品推荐

