2016-12-16 11 views
8

私は外部プロジェクトとインポートされた共有ライブラリを持っています。ディレクトリが含まれており、正しくすべての作業をIMPLIBが、共有ライブラリ(DLL)をインストールしようとすると、次のエラーで失敗します。共有インポートライブラリをインストールできますか?

install TARGETS given target "my_shared_lib" which does not exist in this directory. 

ここで再現するコードです:

add_library(my_shared_lib SHARED IMPORTED GLOBAL) 
set_property(TARGET my_shared_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib") 
set_property(TARGET my_shared_lib PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.dll") 
set_property(TARGET my_shared_lib PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.lib") 

add_executable(main main.cpp) 
add_dependencies(main my_shared_lib) 
target_link_libraries(main PUBLIC my_shared_lib) 

install(TARGETS main DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST") 
install(TARGETS my_shared_lib DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST") 

任意のアイデア?


EDIT:今のところ私は、IMPORTED_LOCATIONを引き出すためにGET_PROPERTYを使用して、その後ファイルをインストールし使用して、そのプロパティの値を与えることで、この問題を回避得ています。それは動作するようですが、より良い、よりイディオム的な - cmakeの解決策はありますか?

答えて

6

CMakeは、インストールを許可していません。インポートライブラリをターゲットとしてインストールできません。代わりにinstall(FILES)を使用してください。

そのような行動のための少なくとも2つの理由があります:bug report通常ライブラリをインストール

Imported targets were originally designed for importing from an existing installation of some external package so installing did not make sense at the time.

  • からCMakeの開発者の1の

    1. Сitationは、CMakeのは、それを変更することができますRPATHのようないくつかのプロパティを調整します。このような変更は、CMake がライブラリの構築方法を知っているので可能です。これは、ライブラリをTARGETとしてインストールすることの主な利点です。

      ただし、の場合IMPORTEDライブラリCMakeにはライブラリのコンパイルプロセスに関する情報がなく、妥当な変更を行うことはできません。したがって、CMakeはライブラリファイルをインストールすることができます:単純なinstall(FILES)に対して利点はありません。

  • +0

    'rpath'は実際には非常に簡単にELFバイナリに変更することができるいくつかのプロパティの一つです https://nixos.org/patchelf.html – curlybracket

    +0

    (TARGET)をインストールここで説明されていない一つの有用な性質を持っています。 .soから .soへのリンクも作成されます。 および .so。 。 Unixライクなシステムではです。 –

    関連する問題