62

私は現在、プロジェクトで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」へのコンテンツを移動すると、ライブラリが見つかりますが、その方法では複数のバージョンを処理できません。

4

6 に答える 6

33

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

例えば:

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

Boostの場合、 FindBoost標準モジュールを使用BOOST_DIRし、Boostライブラリを指すように変数を設定することを強くお勧めします。

于 2012-08-23T07:50:12.927 に答える
18

2人がその質問をお気に入りに入れているのを見たので、私に合った解決策に答えようとします。findモジュールを使用する代わりに、インストールされているすべてのライブラリの構成ファイルを作成しています。これらのファイルは非常に単純であり、非標準変数を設定するためにも使用できます。CMakeは(少なくともWindowsでは)これらの構成ファイルを検索します

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

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

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

その構成では、変数を設定できます。Boostの設定ファイルは次のようになります。

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 )

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

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

于 2012-09-29T22:43:45.807 に答える
9

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

cmakeは 、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)

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

D:/develop/cmake/libs/libA;D:/develop/cmake/libB
于 2015-01-20T07:53:58.273 に答える
7

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

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

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

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

于 2012-08-23T11:52:19.240 に答える
7

ネストのレベルが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」をチェックします。 FIND_LIBRARY()が呼び出されたときのPATH"。

于 2013-10-28T14:36:01.343 に答える
-2

私は同様のシナリオに遭遇しました。私は直前にこの次のコードを追加することでそれを解決しましたfind_library()

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

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

于 2013-07-25T14:17:57.147 に答える