1

静的ライブラリ、共有ライブラリ、Qt GUI アプリケーションを含むサブプロジェクトのコレクションである QBS プロジェクトがあります。Qt GUI アプリケーションは、リンク段階が失敗し、プロジェクト チェーンの初期にビルドされたライブラリに対していくつかの「/usr/bin/ld: {library} が見つかりません: ファイル形式が認識されません」というエラーをスローするという問題を引き起こしています。ただし、このエラーをスローするものとほぼ同じ .qbs ファイルを持つライブラリを含め、すべてのライブラリに対してこれを行うわけではありません。

奇妙なことに、アプリケーションを独自にビルドすると、つまり、トップレベルではなくアプリケーションのプロジェクト ディレクトリ内から qbs を実行すると、正常にビルドされます (依存ライブラリがすべてインストール ディレクトリ内に存在すると仮定します)。私が見た主な違いは、完全なプロジェクトをビルドするとき、アプリケーションの cpp.libraryPaths がプロジェクト内のすべての製品で無視され、アプリケーションがビルド ディレクトリで生成された lib ファイルに対してリンクしようとすることです。 cpp.libraryPaths は意図したとおりに使用され、インストール ディレクトリ内のファイルは正常にリンクされています。

ビルド ディレクトリ内のファイルがエラーをスローしているときに、インストール ディレクトリ内の lib ファイルがリンクされる理由がわかりません。そもそもリンクが失敗する原因は何ですか? さらに、最上位で qbs を呼び出してすべてをビルドできるように、プロジェクト構成を修正するにはどうすればよいですか。私はおそらくこれを間違った方法で行っていますか?

ビルドを開始するために使用するコマンドは次のとおりです。

qbs qbs.installRoot:. release

そして、問題の視覚的表現:

Poject         <-- calling qbs here throws errors at linking application
|- LibraryOne
|- LibraryTwo
|- Application <-- calling qbs here works if libraries already built

そして、これは関連するqbsファイルの非常に単純化された複製です

-- SubOne.qbs and SubTwo --
// These are identical excluding the files

StaticLibrary {
    name: // "One" or "Two"
    files: [/*Files...*/]

    Depends { 
        name: "Qt"
        submodules: [/*core, etc...*/]
    }

    Depends { name: "cpp" }

    // cpp depends and properties   

    Group {
        fileTagsFilter: product.type
        qbs.installDir: "lib"
        qbs.install: true
    }
}

-- App.qbs --

QtGuiApplication {
    name: "App"
    files: [/*Files...*/]

    Depends { name: "One" } // I comment out these depends when building the Application on it's own
    Depends { name: "Two" }

    Depends { name: "cpp" }
    cpp.includePaths: ["../One/include","..Two/include"]
    cpp.libraryPaths: ["../lib"] // <-- Ignored during full project build
    cpp.staticLibraries: ["One","Two"]

    Group {
        fileTagsFilter: product.type
        qbs.installDir: "bin"
        qbs.install: true
    }
}
4

1 に答える 1