2016-09-25 11 views
0

has been asked on SO beforeさらにa related bug on this in CMAKEがあります。しかし、私の問題はバリエーションであり、答えは明らかではありません。find_libraryは共有ライブラリの代わりにスタティックライブラリを選択します

私のしわは、私がMinGWを使ってLinux上でWindows用にクロスコンパイルしていることです。静的ライブラリの名前は、それぞれlibGLESv2.dlliconv.dllの場合、libGLESv2.dll.alibiconv.dll.aのようになります。

例:

find_library(FOUND_LIB_X NAMES "zlib1.dll" PATHS ${CMAKE_FIND_ROOT_PATH}/bin/) 
finds this: zlib1.dll 

find_library(FOUND_LIB_Y NAMES "libGLESv2.dll" PATHS ${CMAKE_FIND_ROOT_PATH}/bin/) 
finds this: libGLESv2.dll.a 

find_library(FOUND_LIB_Y NAMES "iconv.dll" PATHS ${CMAKE_FIND_ROOT_PATH}/bin/) 
finds this: libiconv.dll.a 

The CMAKE bug静的libにはblah.lib(Windows)またはblah.a(Linux)の命名された伝統的な状況に言及しているようです。 Linux上のmingwでのこのクロスコンパイラの状況では、blah.dll.aという名前が付けられています。

文字どおりiconv.dllという名前のファイルを見つける必要があります。それが文字通り見つからなければ、中断する。間違ったCMAKE機能を使用していますか? (find_library()を使用していない?)

+0

奇妙な。 [documentation](https://cmake.org/cmake/help/v3.6/command/find_library.html)によると、 'NAMESオプションに与えられた各ライブラリ名は、まずライブラリファイル名とみなされ、次にプラットフォーム固有の接頭辞(例:lib)と接尾辞(例:.so).'あなたが 'iconv.dll'を含んでいる同じディレクトリ**に' libiconv.dll.a' **を見つけてもよろしいですか?最後の手段として、 'find_library'呼び出しの前に変数' CMAKE_FIND_LIBRARY_PREFIXES'または 'CMAKE_FIND_LIBRARY_SUFFIXES'を消去することができます。 – Tsyvarev

+1

ところで、あなたは 'find_library'が何か新しいものを見つけることを許可するために毎回CMakeキャッシュを再構成する前にきれいにしていますか? – Tsyvarev

+1

@Tsyvarev - 文字通りiconv.dllと呼ばれるファイルは、PATHSパラメータで指定された/ binフォルダにあります。文字通りlibiconv.dll.aと呼ばれる別のファイルは、/ binに/ binと並行しています。はい、私はキャッシュをクリアします。 – 010110110101

答えて

0

CMakeのライブラリを検索するときにライブラリ名とディレクトリを反復間明確な順序を使用しています。たとえば、documentation

NAMESオプションに複数の値が指定されている場合、このコマンドはデフォルトで1つの名前を考慮し、すべてのディレクトリを検索します。

dir1/name2のライブラリである

、そして

find_library(MYLIB NAMES name1 name2 PATHS dir1 dir2) 
message(${MYLIB}) 

dir2/name1dir2/name1を印刷します。

オプションは選択を逆NAMES_PER_DIRを指定:

find_library(MYLIB NAMES name1 name2 NAMES_PER_DIR PATHS dir1 dir2) 
message(${MYLIB}) 

dir1/name2を印刷します。

物事は、ライブラリの接頭辞と接尾辞を試みると異なっている:

NAMESオプション最初のライブラリのファイル名とみなされ、その後、プラットフォーム固有の接頭辞(例えばLIB)と接尾辞と考えられているに与えられたそれぞれのライブラリ名(例えば、.so)。

ディレクトリを反復するときlib<name>.soのチェックがすぐに<name>後に実行されているようです。 dir1/libname.sodir2/name

find_library(MYLIB NAMES name PATHS dir1 dir2) 
message(${MYLIB}) 

のライブラリがdir1/libname.soが印刷されますと、ある

。あなたのケースで、なぜlibiconv.dll.aを発見され

lib/ディレクトリがfind_library探索アルゴリズムのステップ5でシステム固有のパスとして検索されますが、ディレクトリbin/は、PATHオプションとして指定された、唯一のステップ6

で検索されますあなたが欲しいものを見つけるための最も簡単な方法はとてもlib/で検索、NO_DEFAULT_PATHオプションを使用することで、すべてで実行されません。

find_library(FOUND_LIB_Y 
    NAMES "iconv.dll" 
    PATHS ${CMAKE_FIND_ROOT_PATH}/bin/ 
    NO_DEFAULT_PATH 
) 
関連する問題