2016-04-22 2 views
3

:ベンダーがアーカイブ cmakeの:ビルド済みのライブラリで構成され、新しいライブラリのターゲットを作成し、私はcmakeのでカスタムターゲットを作成しようとしている

  • を供給

    • リンクtarget_compile_options(... PUBLIC ...)
    • target_include_directories(... PUBLIC ...)を追加する追加

    このようにして、コンシューマは新しいターゲットとリンクし、必要なインクルードディレクトリとコンパイルオプションを設定できます。

    ブーストビルドでは、<file>機能を使用して、ビルド済みのライブラリを "ラップ"または "エイリアス"し、ライブラリを使用するすべてのターゲットに追加される "使用要件"(コンパイラフラグなど)を追加できます。

    lib foo 
    : 
    : <file>vendor/library.a 
    : 
    : <include>vendor 
    ; 
    
    • これは、新しいライブラリfooとしてvendor/library.a別名。
    • 別のターゲットでfooを使用すると、そのインクルードパスも更新されます。
    • fooを使用しているコードは、#include "foo.h"になります。vendorがインクルードパスに追加されているため、ファイルが見つかります。

    私はCMakeで同じことをする方法を探しています。

    私は現在、これらの線に沿って何かだろうだろう方法:

    find_library(LIB_FOO library.a PATHS ${CMAKE_SOURCE_DIR}/path/to/vendor NO_DEFAULT_PATH) 
    
    target_link_library  (my_target ${LIB_FOO}) 
    target_include_directories(my_target PRIVATE "${CMAKE_SOURCE_DIR}/path/to/vendor") 
    

    fooを使用する必要があるいくつかの目標がある場合は、これらの3つの呼び出しは、それらの各々のために繰り返されているだろう、それはかなり厄介なものになる。

    持っている他のいくつかの目標を持っているfooの消費者にとってはるかに容易になるだろう

    target_link_libraries  (foo ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a) 
    target_compile_options (foo PUBLIC ...) 
    target_include_directories(foo PUBLIC ...) 
    

    質問:

    • は私がで構成されてい新しいライブラリターゲットを作成することができます私が記述したことを私ができるようにする事前に作られた図書館?コメントに応答して

    編集:

    hereが説明するように)私はIMPORTEDライブラリを作成しようとしました:

    add_library(foo STATIC IMPORTED) 
    set_property(TARGET foo PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a) 
    

    しかし、私は、その後のディレクトリに私を含める設定しようとすると、エラーが発生する:

    target_include_directories(foo SYSTEM PUBLIC "${CMAKE_CURRENT_LIST_DIR}/vendor") 
    

    エラーまたは:

    CMake Error at vendor/CMakeLists.txt:39 (target_include_directories): 
        Cannot specify include directories for imported target "foo". 
    
  • +1

    で説明したように、手動でこれらの小道具を設定する必要があります/ Exporting_and_Importing_Targets) – user3159253

    +0

    @ user3159253ありがとう!どのようにして私の 'IMPORTED target'に' target_include_directories(foo PUBLIC ...) 'を追加するのですか?インポートされたターゲット "foo"にインクルードディレクトリを指定できません。 –

    +1

    参照[this](http://stackoverflow.com/questions/25907478/possible-to-add-an-imported-library-toターゲットリンクライブラリ(that-takes-care-of)):)この[issue](https://cmake.org/Bug/view.php?id=15689)もチェックしてください。 'set_target_properties(... INTERFACE_INCLUDE_DIRECTORIES ...)'を使います。醜い見えますが、うまくいけば動作します – user3159253

    答えて

    1
    1. あなたは、事前に構築されたライブラリをインポートする必要があります。 hereはそれを行う方法のチュートリアルです。
    2. 結果を「完全」にするには、特定のプロパティを追加する必要があります。残念ながら、this CMake issueのため、これは通常のテクニックを使用して行うことはできません。だから、私はそれが(こちら行われているようにあなたは、事前に構築されたライブラリをインポートする必要があると思いますhttps://cmake.org/Wiki/CMake/Tutorials this SO QA
    関連する問題