如何在QT pro文件中定义含QMAKE_HOST.version_string的字符串宏?
在Qt .pro文件中检测Linux发行版并定义宏的实现思路
思路1:读取标准系统标识文件(推荐)
主流Linux发行版都会提供/etc/os-release文件,包含统一格式的发行版信息,可通过shell命令提取关键字段并定义宏:
# 仅在Linux平台执行 unix:!macx { # 提取发行版ID(如ubuntu、centos、debian) OS_ID = $$system(grep -E '^ID=' /etc/os-release | cut -d'=' -f2 | tr -d '"') # 提取发行版版本号(如22.04、8.5) OS_VERSION = $$system(grep -E '^VERSION_ID=' /etc/os-release | cut -d'=' -f2 | tr -d '"') # 定义宏供代码调用 DEFINES += OS_ID=\"$$OS_ID\" DEFINES += OS_VERSION=\"$$OS_VERSION\" }
代码中使用示例:
#ifdef OS_ID qDebug() << "当前构建发行版:" << OS_ID; qDebug() << "版本号:" << OS_VERSION; #endif
思路2:利用lsb_release命令(需依赖包)
部分发行版支持lsb_release命令(需预先安装lsb-release包),直接提取发行版名称和版本:
unix:!macx { OS_DISTRO = $$system(lsb_release -si) OS_RELEASE = $$system(lsb_release -sr) DEFINES += OS_DISTRO=\"$$OS_DISTRO\" DEFINES += OS_RELEASE=\"$$OS_RELEASE\" }
注:无lsb_release的系统会失效,优先级低于思路1。
思路3:针对特定发行版的文件判断
若需针对个别发行版做差异化处理,可通过检查发行版专属文件来定义宏:
unix:!macx { exists(/etc/centos-release) { DEFINES += DISTRO_CENTOS CENTOS_VERSION = $$system(cat /etc/centos-release | grep -o '[0-9]\+\.[0-9]\+') DEFINES += CENTOS_VERSION=\"$$CENTOS_VERSION\" } exists(/etc/lsb-release) { DEFINES += DISTRO_UBUNTU UBUNTU_VERSION = $$system(grep DISTRIB_RELEASE /etc/lsb-release | cut -d'=' -f2) DEFINES += UBUNTU_VERSION=\"$$UBUNTU_VERSION\" } exists(/etc/debian_version) { DEFINES += DISTRO_DEBIAN DEBIAN_VERSION = $$system(cat /etc/debian_version) DEFINES += DEBIAN_VERSION=\"$$DEBIAN_VERSION\" } }
代码中使用示例:
#ifdef DISTRO_CENTOS qDebug() << "CentOS版本:" << CENTOS_VERSION; #endif
注意事项
- 确保构建环境自带
grep、cut、tr等基础工具(绝大多数Linux系统默认包含); - 提取字段时用
tr -d '"'去除引号,避免宏定义语法错误; - 若项目需跨平台构建,务必将Linux检测代码放在
unix:!macx条件块内。
内容的提问来源于stack exchange,提问作者jakob moehlenkamp
相关产品推荐
相关产品推荐

