web-dev-qa-db-ja.com

cmake-find_library-カスタムライブラリの場所

私は現在、プロジェクトでCMakeを実行しようとしています(Windowsで)。すべてのライブラリがインストールされているカスタムの場所を使用したい。 CMakeにそのパスを知らせるために、私はそれを試みました:

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs)

しかし、ライブラリを見つけようとすると

find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static)

CMakeが見つかりません。プレフィックスパスを

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs/curl)

...ライブラリがあります。

だから私の質問は次のとおりです。そのように見えるカスタムの場所でディレクトリ構造を使用するようにCMakeを適切に構成するにはどうすればよいですか。

D:/develop/cmake/libs/
-> libA
   -> include
   -> lib
-> libB
   -> include
   -> lib
-> ...
   -> include
   -> lib

「include」には公開ヘッダーがあり、「lib」にはコンパイル済みライブラリがあります。

誰かが私を助けてくれることを願っています-事前に感謝します

編集:私の現在の回避策は、ライブラリを検索する前にこれを行うことです:

set(CUSTOM_LIBRARY_PATH D:/develop/cmake/libs)
file(GLOB sub-dir ${CUSTOM_LIBRARY_PATH}/*)
foreach(dir ${sub-dir})
    if(IS_DIRECTORY ${dir})
        set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH};${dir})
    endif()
endforeach()

しかし、そのように、boostのデフォルトのモジュールは、boostのディレクトリ構造が少し異なるため、それまでそれを見つけません。

boost -> include -> boost-1_50 -> *.hpp

「boost-1_50」から「include」にライブラリを見つけることができる場合、コンテンツを移動すると、そのように複数のバージョンを正しく処理できませんか?

49
Daniel

私は2人がその質問をお気に入りに入れているのを見たので、私に役立つ解決策に答えようとします。これらのファイルは非常にシンプルで、非標準の変数を設定するためにも使用できます。 CMakeは(少なくともWindows上で)これらの構成ファイルを検索します

CMAKE_PREFIX_PATH/<<package_name>>-<<version>>/<<package_name>>-config.cmake

(環境変数を介して設定できます)。たとえば、ブースト構成は次のパスにあります

CMAKE_PREFIX_PATH/boost-1_50/boost-config.cmake

その構成では、変数を設定できます。ブースト用の私の設定ファイルは次のようになります。

set(boost_INCLUDE_DIRS ${boost_DIR}/include)
set(boost_LIBRARY_DIR ${boost_DIR}/lib)
foreach(component ${boost_FIND_COMPONENTS}) 
    set(boost_LIBRARIES ${boost_LIBRARIES} debug ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-Gd-1_50.lib)
    set(boost_LIBRARIES ${boost_LIBRARIES} optimized ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-1_50.lib)
endforeach()
add_definitions( -D_WIN32_WINNT=0x0501 )

かなり簡単+ヘルパー関数を作成すると、構成ファイルのサイズをさらに縮小することができます。私がこのセットアップで持っている唯一の問題は、設定ファイルを検索モジュールよりも優先する方法を見つけられなかったということです。そのため、検索モジュールを削除する必要があります。

これが他の人に役立つことを願っています。

13
Daniel

最も簡単な解決策は、それぞれにHINTSを追加することです find_* リクエスト。

例えば:

find_library(CURL_LIBRARY
    NAMES curl curllib libcurl_imp curllib_static
    HINTS "${CMAKE_PREFIX_PATH}/curl/lib"
)

Boostの場合、 FindBoost 標準モジュールを使用し、BOOST_DIR変数は、Boostライブラリを指します。

25
Silas Parker

CMAKE_PREFIX_PATHを自動的に設定する方法はありません。この問題を解決するには、次の方法があります。

  1. すべてのライブラリファイルを同じディレクトリに配置します。つまり、include/にはすべてのライブラリのヘッダー、lib/-バイナリなどが含まれます。参考までに、これはほとんどのUNIXライクなシステムに共通のレイアウトです。

  2. グローバル環境変数CMAKE_PREFIX_PATHD:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;...に設定します。 CMakeを実行すると、このenv変数が自動的に選択され、独自のCMAKE_PREFIX_PATHが設定されます。

  3. -D CMAKE_PREFIX_PATH=...引数を使用してcmakeコマンドを呼び出すラッパー.batスクリプトを作成します。

7
arrowd

複数のパスを追加してCMAKE_PREFIX_PATHを使用します(セミコロンで区切って、空白なし)。環境変数として設定して、cmake構成ファイルに絶対パスが含まれないようにすることができます

Cmakeは following folder のいずれかで構成ファイルを探すことに注意してください。ここで、CMAKE_PREFIX_PATHのパスのいずれかで、nameは探しているライブラリの名前です

<prefix>/                                               (W)
<prefix>/(cmake|CMake)/                                 (W)
<prefix>/<name>*/                                       (W)
<prefix>/<name>*/(cmake|CMake)/                         (W)
<prefix>/(lib/<Arch>|lib|share)/cmake/<name>*/          (U)
<prefix>/(lib/<Arch>|lib|share)/<name>*/                (U)
<prefix>/(lib/<Arch>|lib|share)/<name>*/(cmake|CMake)/  (U)

あなたの場合、次の2つのパスをCMAKE_PREFIX_PATHに追加する必要があります。

D:/develop/cmake/libs/libA;D:/develop/cmake/libB
6
Pierluigi

ネストの追加レベルが1つあります。 CMAKEは、$CMAKE_PREFIX_PATH/includeでヘッダーを検索し、$CMAKE_PREFIX_PATH/libsでライブラリを検索します。

CMAKEから ドキュメント

CMAKE_PREFIX_PATHリスト内の各パスについて、CMakeはFIND_PATH()が呼び出されると「PATH/include」と「PATH」、FIND_PROGRAM()が呼び出されると「PATH/bin」と「PATH」、「PATH/libとFIND_LIBRARY()が呼び出されたときのPATH」。

4
Sameer Asal

同様のシナリオに遭遇しました。 find_library()の直前に次のコードを追加して解決しました。

set(CMAKE_PREFIX_PATH /the/custom/path/to/your/lib/)

その後、ライブラリの場所を見つけることができます。

0
vivi