2016-12-19 8 views
1

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

奇妙なことに、自分でアプリケーションをビルドした場合、つまりトップレベルではなくアプリケーションのプロジェクトディレクトリから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 

そして、ここではrelevent 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 
    } 
} 

答えて

2

サブディレクトリからqbsを実行しないでください。 常にをトップレベルプロジェクトファイルで実行する必要があります。すでに(これは決して扱いません、あなたがあなたのアプリケーションを持っているのDepends項目として、アプリケーション内のcpp.libraryPathscpp.staticLibrariesを設定するべきではない、第二に

// project.qbs 
import qbs 

Project { 
    // order doesn't matter here 
    references: [ 
     "LibraryOne/SubOne.qbs", 
     "LibraryTwo/SubTwo.qbs", 
     "Application/App.qbs" 
    ] 
} 

:あなたのルートディレクトリでは、このようなファイルを持っている必要がありますそれらをコメントアウトする)。

そうのようなあなたのcpp.includePaths性質はまた、代わりに、彼らはあなたのそれぞれの静的ライブラリのそれぞれにExport項目に入る必要があり、アプリケーションで設定すべきではありません。

StaticLibrary { 
    ... 
    Export { 
     Depends { name: "cpp" } 
     cpp.includePaths: [product.sourceDirectory + "/include"] 
    } 
    ... 
} 

はその後qbs -f project.qbsを実行し、すべてが構築する必要があります正しく

関連する問題