此has been asked on SO before甚至a related bug on this in CMAKE。但是,我的问题是变化,答案不明确。
我的皱纹是我在Linux上使用MinGW交叉编译Windows。对于DLL libGLESv2.dll.a
和libiconv.dll.a
,静态库的命名方式分别为libGLESv2.dll
和iconv.dll
。
示例:
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 :(得分:0)
在搜索库时,CMake在迭代库名和目录之间使用明确的顺序。例如,根据documentation,
当为NAMES选项提供多个值时,默认情况下,此命令将一次考虑一个名称并搜索每个目录。
即,dir1/name2
和dir2/name1
find_library(MYLIB NAMES name1 name2 PATHS dir1 dir2)
message(${MYLIB})
将打印dir2/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.so
和dir2/name
find_library(MYLIB NAMES name PATHS dir1 dir2)
message(${MYLIB})
将打印dir1/libname.so
。
这就是为什么在您的案例中找到libiconv.dll.a
的原因:lib/
目录在find_library
搜索算法的第5步搜索为系统特定路径,但指定了目录bin/
作为PATH选项,仅在步骤6中搜索。
找到所需内容的最简单方法是使用 NO_DEFAULT_PATH 选项,因此根本不会执行lib/
中的搜索:
find_library(FOUND_LIB_Y
NAMES "iconv.dll"
PATHS ${CMAKE_FIND_ROOT_PATH}/bin/
NO_DEFAULT_PATH
)