首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QBS:显式设置产品内部的qbs.profiles,导致生成失败

QBS:显式设置产品内部的qbs.profiles,导致生成失败
EN

Stack Overflow用户
提问于 2018-10-24 13:28:16
回答 1查看 229关注 0票数 0

我的用例是:

我有一个静态的库,我想提供一些个人资料(例如"gcc",“手臂gcc”,“mips-1996”)。

我也有一个链接到这个库的应用程序,但是这个应用程序应该只使用特定的配置文件(例如“手臂-gcc”)构建。

为此,我将修改应用程序和库QBS示例。

lib.qbs文件:

代码语言:javascript
复制
import qbs 1.0

Product {
    qbs.profiles: ["gcc", "arm-gcc", "mips-gcc"] //I added only this line
    type: "staticlibrary"
    name: "mylib"
    files: [
        "lib.cpp",
        "lib.h",
    ]
    Depends { name: 'cpp' }
    cpp.defines: ['CRUCIAL_DEFINE']

    Export {
        Depends { name: "cpp" }
        cpp.includePaths: [product.sourceDirectory]
    }
}

app.qbs文件:

代码语言:javascript
复制
import qbs 1.0

Product {
    qbs.profiles: ["arm-gcc"] //I added only this line
    type: "application"
    consoleApplication: true
    files : [ "main.cpp" ]
    Depends { name: "cpp" }
    Depends { name: "mylib" }
}

应用程序构建失败。Qbs错误地试图链接到图书馆的"gcc“版本,而不是"arm-gcc”版本,正如您在日志中看到的那样:

代码语言:javascript
复制
Build graph does not yet exist for configuration 'default'. Starting from scratch.
Resolving project for configuration default
Setting up build graph for configuration default
Building for configuration default
compiling lib.cpp [mylib {"profile":"gcc"}]
compiling lib.cpp [mylib {"profile":"arm-gcc"}]
compiling lib.cpp [mylib {"profile":"mips-gcc"}]
compiling main.cpp [app]
creating libmylib.a [mylib {"profile":"gcc"}]
creating libmylib.a [mylib {"profile":"mips-gcc"}]
creating libmylib.a [mylib {"profile":"arm-gcc"}]
linking app [app]
ERROR: /usr/bin/arm-linux-gnueabihf-g++ -o /home/user/programs/qbs/usr/local/share/qbs/examples/app-and-lib/default/app.7d104347/app /home/user/programs/qbs/usr/local/share/qbs/examples/app-and-lib/default/app.7d104347/3a52ce780950d4d9/main.cpp.o /home/user/programs/qbs/usr/local/share/qbs/examples/app-and-lib/default/mylib.eyJwcm9maWxlIjoiZ2NjIn0-.792f47ec/libmylib.a

ERROR: /home/user/programs/qbs/usr/local/share/qbs/examples/app-and-lib/default/mylib.eyJwcm9maWxlIjoiZ2NjIn0-.792f47ec/libmylib.a: error adding symbols: File format not recognized
collect2: error: ld returned 1 exit status
ERROR: Process failed with exit code 1.
The following products could not be built for configuration default:
app

只有在选择一个配置文件时,构建才会失败,并且这个配置文件不应该是lib.qbs文件中qbs.profiles行中的第一个配置文件。

当选择两个或多个配置文件时,构建成功。

我的分析:

我认为这个问题与多路复用有关:

lib.qbs包含多个配置文件。这会在构建库时启动多路复用,而库又会向构建目录名称(moduleloader.cpp)添加额外的“moduleloader.cpp”。

app.lib只包含一个配置文件,因此不会打开多路复用,构建目录名也不会得到额外的字符串。

这个问题可以通过更改代码(moduleloader.cpp)来解决,这样即使只有一个配置文件,也可以打开多路复用,即使用以下修补程序:

代码语言:javascript
复制
--- moduleloader.cpp    2018-10-24 16:17:43.633527397 +0300
+++ moduleloader.cpp.new    2018-10-24 16:18:27.541370544 +0300
@@ -872,7 +872,7 @@
             = callWithTemporaryBaseModule<const MultiplexInfo>(dummyContext,
                                                                extractMultiplexInfoFromProduct);

-    if (multiplexInfo.table.size() > 1)
+    if (multiplexInfo.table.size() > 0)
         productItem->setProperty(StringConstants::multiplexedProperty(), VariantValue::trueValue());

     VariantValuePtr productNameValue = VariantValue::create(productName);
@@ -891,7 +891,7 @@
         const QString multiplexConfigurationId = multiplexInfo.toIdString(row);
         const VariantValuePtr multiplexConfigurationIdValue
             = VariantValue::create(multiplexConfigurationId);
-        if (multiplexInfo.table.size() > 1 || aggregator) {
+        if (multiplexInfo.table.size() > 0 || aggregator) {
             multiplexConfigurationIdValues.push_back(multiplexConfigurationIdValue);
             item->setProperty(StringConstants::multiplexConfigurationIdProperty(),
                               multiplexConfigurationIdValue);

这适用于我的用例。我不知道从更广的角度看这是否有意义。

最后,问题是:

这一切都有意义吗?

这是正常的行为吗?

这个用例根本不受支持吗?

有没有更好的解决办法?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-24 14:39:21

是的,多路复用的默认行为是,非复用产品依赖于依赖项的所有变体。一般来说,用户没有办法改变这种行为,但是应该有。然而,幸运的是,配置文件是特殊的:

代码语言:javascript
复制
Depends { name: "mylib"; profiles: "arm-gcc" }

这应该能解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52970255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档