QBS:在产品内部明确设置qbs.profiles导致构建失败

时间:2018-10-24 13:28:17

标签: qt qbs

我的用例是这样:

我有一个静态库,我希望该库可用于某些配置文件(例如“ gcc”,“ arm-gcc”,“ mips-gcc”)。

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

为此,我正在修改app-and-lib QBS示例。

lib.qbs文件:

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文件:

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”版本,如您在日志中所见:

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

仅当在app.qbs文件中选择一个配置文件时,构建才会失败,并且此配置文件不应是lib.qbs文件中qbs.profiles行中的第一个配置文件。

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

我的分析:

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

lib.qbs包含多个配置文件。这样会在构建库时打开多路复用,从而在构建目录名称(multiplexConfigurationId)中添加附加的'moduleloader.cpp'。

app.lib仅包含一个配置文件,因此不会打开多路复用,并且构建目录名称也不会获得多余的字符串。

可以通过更改代码(moduleloader.cpp)来解决该问题,以便即使只有一个配置文件(即具有以下补丁)也可以进行多路复用:

--- 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);

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

最后,问题:

这一切有意义吗?

这是正常现象吗?

是否完全不支持该用例?

有更好的解决方案吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

是的,多路复用的默认行为是非多路复用乘积取决于相关性的所有变体。通常,用户无法更改该行为,但应该可以。 但是,幸运的是,配置文件很特殊:

Depends { name: "mylib"; profiles: "arm-gcc" }

这应该可以解决您的问题。