qbs не может найти выходные данные субмодуля (сборка с помощью cmake) - PullRequest
0 голосов
/ 04 июня 2018

У меня есть подмодуль, созданный cmake, и я успешно собрал его в сценарии qbs (см. Код ниже).

Product {
name: "mylib"
type: ["staticlibrary"]

// define buildScript, outputPath, libPrefix, libExt, cmakeBuildType, cmakeBuildConfig
// Note that outputPath is inside mylib folder, not qbs's build directory

Rule {
    multiplex: true
    outputArtifacts: [
        {
            filePath: product.outputPath + product.libPrefix + "lib1static" + product.libExt,
            fileTags: ["staticlibrary"]
        },
        {
            filePath: product.outputPath + product.libPrefix + "lib2static" + product.libExt,
            fileTags: ["staticlibrary"]
        }
    ]
    outputFileTags: ["staticlibrary"]
    prepare: {
        var cmd = new Command(product.buildScript, [product.outputPath, product.cmakeBuildType, product.cmakeBuildConfig]);
        cmd.description = "cmake generate mylib";
        cmd.workingDirectory = product.sourceDirectory + "/mylib/build_cmake";

        return [cmd];
    }
}

Однако иногда qbs удаляет "lib1static" и "lib2static", и я получаю эту ошибку при компоновке:

clang: error: no such file or directory: '<path>/lib1static.a'
clang: error: no such file or directory: '<path>/lib2static.a'

Я пытался отладить, но все еще не знаю, почему,Первая сборка может быть успешной со всеми собранными выходными библиотеками, но в следующей сборке все библиотеки исчезнут.

Может кто-нибудь здесь объяснить и сказать мне, что является лучшим методом для этого случая?

1 Ответ

0 голосов
/ 04 июня 2018

Не понимаю, почему файлы будут удалены.Однако есть еще одна проблема: правило, как показано выше, будет запущено только один раз, поскольку оно не имеет входных данных, поэтому изменения в исходных файлах вашего подпроекта не будут приняты.(И, как примечание: если выходные данные не являются «динамическими», вы можете объявить элементы Артефакта, а не использовать свойства outputArtifacts и outputFileTags.) Попробуйте это:

Rule {
    multiplex: true
    alwaysRun: true
    Artifact {
        filePath: product.outputPath + product.libPrefix + "lib1static" + product.libExt
        fileTags: ["staticlibrary"]
        alwaysUpdated: false
    }
    Artifact {
        filePath: product.outputPath + product.libPrefix + "lib2static" + product.libExt
        fileTags: ["staticlibrary"]
        alwaysUpdated: false
    }
    prepare: {
        var cmd = new Command(product.buildScript, [product.outputPath, product.cmakeBuildType, product.cmakeBuildConfig]);
        cmd.description = "cmake generate mylib";
        cmd.workingDirectory = product.sourceDirectory + "/mylib/build_cmake";

        return [cmd];
    }
}
...