私は現在、プロジェクトで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」にライブラリを見つけることができる場合、コンテンツを移動すると、そのように複数のバージョンを正しく処理できませんか?
私は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 )
かなり簡単+ヘルパー関数を作成すると、構成ファイルのサイズをさらに縮小することができます。私がこのセットアップで持っている唯一の問題は、設定ファイルを検索モジュールよりも優先する方法を見つけられなかったということです。そのため、検索モジュールを削除する必要があります。
これが他の人に役立つことを願っています。
CMAKE_PREFIX_PATH
を自動的に設定する方法はありません。この問題を解決するには、次の方法があります。
すべてのライブラリファイルを同じディレクトリに配置します。つまり、include/
にはすべてのライブラリのヘッダー、lib/
-バイナリなどが含まれます。参考までに、これはほとんどのUNIXライクなシステムに共通のレイアウトです。
グローバル環境変数CMAKE_PREFIX_PATH
をD:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;...
に設定します。 CMakeを実行すると、このenv変数が自動的に選択され、独自のCMAKE_PREFIX_PATH
が設定されます。
-D CMAKE_PREFIX_PATH=...
引数を使用してcmake
コマンドを呼び出すラッパー.batスクリプトを作成します。
複数のパスを追加して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
ネストの追加レベルが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」。
同様のシナリオに遭遇しました。 find_library()
の直前に次のコードを追加して解決しました。
set(CMAKE_PREFIX_PATH /the/custom/path/to/your/lib/)
その後、ライブラリの場所を見つけることができます。