:ベンダーがアーカイブ 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".
で説明したように、手動でこれらの小道具を設定する必要があります/ Exporting_and_Importing_Targets) – user3159253
@ user3159253ありがとう!どのようにして私の 'IMPORTED target'に' target_include_directories(foo PUBLIC ...) 'を追加するのですか?インポートされたターゲット "foo"にインクルードディレクトリを指定できません。 –
参照[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