CMake 使用明确的顺序搜索库时在迭代库名称和目录之间。例如,根据文档 https://cmake.org/cmake/help/v3.6/command/find_library.html,
当为 NAMES 选项指定多个值时,默认情况下此命令将一次考虑一个名称并在每个目录中搜索该名称。
也就是说,图书馆位于dir1/name2
and 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
and dir2/name
find_library(MYLIB NAMES name PATHS dir1 dir2)
message(${MYLIB})
将打印dir1/libname.so
.
因此libiconv.dll.a
在您的案例中找到:lib/
在步骤 5 中将目录作为系统特定路径进行搜索find_library
搜索算法,但目录bin/
指定为 PATH 选项,仅在步骤 6 中搜索。
找到你想要的东西的最简单方法是使用NO_DEFAULT_PATH选项,所以搜索lib/
根本不会被执行:
find_library(FOUND_LIB_Y
NAMES "iconv.dll"
PATHS ${CMAKE_FIND_ROOT_PATH}/bin/
NO_DEFAULT_PATH
)