find_library选择静态库而不是共享库

时间:2016-09-25 14:09:44

标签: dll cmake mingw

has been asked on SO before甚至a related bug on this in CMAKE。但是,我的问题是变化,答案不明确。

我的皱纹是我在Linux上使用MinGW交叉编译Windows。对于DLL libGLESv2.dll.alibiconv.dll.a,静态库的命名方式分别为libGLESv2.dlliconv.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()?)

1 个答案:

答案 0 :(得分:0)

在搜索库时,CMake在迭代库名和目录之间使用明确的顺序。例如,根据documentation

  

当为NAMES选项提供多个值时,默认情况下,此命令将一次考虑一个名称并搜索每个目录。

即,dir1/name2dir2/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.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中搜索。

找到所需内容的最简单方法是使用 NO_DEFAULT_PATH 选项,因此根本不会执行lib/中的搜索:

find_library(FOUND_LIB_Y
    NAMES "iconv.dll"
    PATHS ${CMAKE_FIND_ROOT_PATH}/bin/
    NO_DEFAULT_PATH
)