静的ライブラリ、共有ライブラリ、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
}
}