You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从qmake迁移到qbs:.pri文件及安装机制的替代方案

Qbs 相关问题解答

1. 替代 qmake include.pri 的灵活实现方式

你说得对,Qbs 的 Module 确实需要放到指定的 modules 目录,用起来有点繁琐,但其实有更灵活的方式来实现 qmake 里 include.pri 的效果,完全不用调整目录结构:

方式一:用独立的 .qbs 文件封装文件组

在你的源码目录下创建一个简单的 .qbs 文件(比如命名为 my_source_files.qbs),把需要引入的文件和路径配置封装进去:

Group {
    name: "My Source Files"
    files: [
        "my_file.h",
        "my_file.cpp"
    ]
    // 导出路径配置,方便主项目继承
    export: {
        cpp.includePaths += path
        cpp.dependencyPaths += path
    }
}

然后在主项目的 .qbs 文件里,通过 import 引入这个文件,再把它的内容整合到你的产品中:

import "some_path/my_source_files.qbs" as ExternalSourceGroup

Project {
    Product {
        type: "application"
        files: "main.cpp"
        
        // 引入外部文件组
        Group {
            name: "External Sources"
            files: ExternalSourceGroup.files
            // 继承导出的路径配置
            cpp.includePaths: base.concat(ExternalSourceGroup.export.cpp.includePaths)
            cpp.dependencyPaths: base.concat(ExternalSourceGroup.export.cpp.dependencyPaths)
        }
    }
}

方式二:直接在主项目中引用路径

如果你的需求很简单,甚至可以跳过封装,直接在主项目里用路径引用文件:

Project {
    Product {
        type: "application"
        files: [
            "main.cpp",
            "some_path/my_file.h",
            "some_path/my_file.cpp"
        ]
        // 添加源码目录到 include 路径
        cpp.includePaths: base.concat(["some_path"])
    }
}

方式三:用 SubProject 管理独立模块

如果这个源码目录未来可能要做成静态库/动态库,推荐用 SubProject 来管理,在源码目录下写一个完整的 Product 配置(比如 mylib.qbs):

StaticLibrary {
    name: "mylib"
    files: [
        "my_file.h",
        "my_file.cpp"
    ]
    cpp.includePaths: [path]
}

然后在主项目里引入这个子项目并添加依赖:

Project {
    SubProject {
        filePath: "some_path/mylib.qbs"
        configurationName: project.configurationName
    }
    
    Product {
        type: "application"
        files: "main.cpp"
        // 依赖子项目的静态库
        Depends { name: "mylib" }
    }
}

2. 静态库的外部目录安装问题

首先纠正一个误解:Qbs 完全支持安装到绝对路径,你之前觉得 Group.installPath 只能用相对路径可能是测试时的小疏漏。

直接使用绝对路径安装

你可以直接在 installPath 里写绝对路径,只要确保 qbs.install 设为 true 即可:

StaticLibrary {
    name: "mylib"
    files: "my_file.cpp"
    
    // 安装公共头文件到绝对路径
    Group {
        name: "Public Headers"
        files: "my_file.h"
        installPath: "/usr/local/include/mylib"
        qbs.install: true
    }
    
    // 安装库文件到绝对路径
    Group {
        files: product.targetName + product.suffix
        installPath: "/usr/local/lib"
        qbs.install: true
    }
}

注意:安装到系统目录(比如 /usr/local)可能需要管理员权限,执行安装命令时记得加 sudo(Linux/macOS)或者以管理员身份运行终端(Windows)。

Qbs 推荐相对路径 + installPrefix 的原因

Qbs 默认推荐用相对路径结合 installPrefix,主要是为了跨平台兼容性和构建可重现性:

  • 不同平台的标准安装目录不同(比如 Linux 是 /usr/local,Windows 是 C:\Program Files),用 installPrefix 可以在构建时通过命令行灵活指定:
    qbs install --install-prefix "/usr/local"
    
  • 硬编码绝对路径会让项目在不同机器上的构建变得不灵活,比如不同用户的自定义安装目录可能不一样。

如果你的场景确实需要固定的绝对路径,直接写就好,Qbs 没有限制。

内容的提问来源于stack exchange,提问作者Alex Nevskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:24:23