【问题标题】:find_library chooses the static library instead of the shared libraryfind_library 选择静态库而不是共享库
【发布时间】:2016-09-25 14:09:44
【问题描述】:

这个has been asked on SO before,甚至还有a related bug on this in CMAKE。但是,我的问题是一个变体,答案并不明确。

我的问题是我正在使用 MinGW 为 Linux 上的 Windows 进行交叉编译。静态库的命名如下:libGLESv2.dll.alibiconv.dll.a,DLL 分别为 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 似乎指的是静态库被命名为 blah.lib (Windows) 或 blah.a (Linux) 的传统情况。在 Linux 上使用 mingw 的这种交叉编译器情况下,它们被命名为 blah.dll.a

我需要它来查找字面上称为iconv.dll 的文件,仅此而已。如果它没有从字面上找到,那么中止。我是否使用了错误的 CMAKE 功能? (不要使用find_library()?)

【问题讨论】:

  • 奇怪。根据documentationEach library name given to the NAMES option is first considered as a library file name and then considered with platform-specific prefixes (e.g. lib) and suffixes (e.g. .so).。你确定它找到了libiconv.dll.a在同一目录中,其中包含iconv.dll?最后,您可以在调用find_library 之前清理变量CMAKE_FIND_LIBRARY_PREFIXESCMAKE_FIND_LIBRARY_SUFFIXES
  • 顺便说一句,您在每次重新配置之前清理 CMake 缓存以允许 find_library 找到新的,不是吗?
  • @Tsyvarev -- 一个字面上称为 iconv.dll 的文件位于 PATHS 参数中指定的 /bin 文件夹中。另一个名为 libiconv.dll.a 的文件位于与 /bin 平行的 /lib 中。是的,我清除了缓存。

标签: dll cmake mingw


【解决方案1】:

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 步被搜索为系统特定路径,但指定为 PATH 选项的目录 bin/ 仅在以下位置搜索第 6 步。

找到您想要的最简单的方法是使用 NO_DEFAULT_PATH 选项,因此根本不会在 lib/ 中进行搜索:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2010-12-23
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多