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

2024-04-07

This 之前曾被问过 https://stackoverflow.com/questions/3537588/issue-on-using-cmake-with-msys-mingw-linking-dll-files-using-devil-image-library?rq=1甚至还有CMAKE 中与此相关的错误 https://cmake.org/Bug/view.php?id=1643。然而,我的问题是一个变体,答案并不清楚。

我的问题是我使用 MinGW 在 Linux 上对 Windows 进行交叉编译。静态库的命名方式如下libGLESv2.dll.a and libiconv.dll.a对于 DLLlibGLESv2.dll and 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

CMAKE 错误 https://cmake.org/Bug/view.php?id=1643似乎指的是静态库被命名为 blah.lib (Windows) 或 blah.a (Linux) 的传统情况。在 Linux 上使用 mingw 进行交叉编译的情况下,它们被命名为 blah.dll.a

我需要它来找到字面上称为的文件iconv.dll没有别的。如果实际上没有找到,则中止。我使用了错误的 CMAKE 函数吗? (不要使用find_library()?)


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
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

find_library 选择静态库而不是共享库 的相关文章

  • Jenkins + Cmake + JIRA = 多个相互依赖项目的 CI?

    我们的系统中有许多小项目在 Linux 上运行 Slackware 7 11 正在慢慢迁移到 RHEL 6 0 大约 50 100 个应用程序和 15 20 个库 我们几乎所有的应用程序都使用我们的一个或多个库 我们的源树看起来像这样 ap
  • Qt5 CMake 将所有库包含到可执行文件中

    我正在尝试使用 Qt 5 14 构建一个发布模式下的应用程序 并且 Qt Creator 内部一切正常 但是当我尝试单独运行可执行文件时 我收到如下错误 OS Windows 10 Qt 5 14 Cmake 3 5 我尝试过的 设置 CM
  • 如何安装和使用 YAML-Cpp

    我想学习 YAML 并将其与 C 一起使用 但我一直在尝试设置YAML Cpp 让我解释一下到目前为止我所做的事情 我下载了源代码 版本0 5 1 安装的 Cmake 适用于 Windows 安装了 Boost 库 为 Visual Stu
  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • 设置 CMake OBJECT 库的输出目录

    在我的 CMake 文件中 我指定了一个对象库 add library core OBJECT sourcefiles 我在共享库中进一步引用了这组目标文件 add library sharedlib SHARED
  • 来自库的 CMake link_directories

    我正在尝试使用 CMake 和 Xcode 从另一个库链接到一个库 这对任何图书馆来说都是一个问题 但为了让事情更容易传达 让我们使用zlib举个例子 这似乎适用于可执行文件 如下所示 LINK DIRECTORIES LIB DIR zl
  • 如何在 Windows 中使用 cmake 更轻松地链接 gtk 库?

    我现在通过手动包含所有必需的路径 gtk包位于D Tools gtk bundle 2 20 0 20100406 win32 include directories D Tools gtk bundle 2 20 0 20100406 w
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • 如何在 Windows 中使用 cmake 构建和链接 google benchmark

    我正在尝试构建 google benchmark 并使用 cmake 将其与我的库一起使用 我已经成功构建了 google benchmark 并使用 cmake 成功运行了所有测试 不幸的是 我无法使用 cmake 或 cl 将其与 Wi
  • cmake MSYS Makefiles 生成器丢失

    我通过 pacman 安装了 cmake 3 2 3 当我尝试从 msys64 shell 中使用它时出现错误 cmake G MSYS Makefiles CMake Error Could not create named genera
  • 关闭时不会调用 SetConsoleCtrlHandler

    我编写了一个在控制台中运行的应用程序 需要在系统关闭或用户注销之前进行快速备份 我的测试应用程序编写一个带有信号的文件 并在手动关闭控制台窗口 单击 X 时工作 但当控制台在关机或注销时关闭时 它不起作用 从我在 MSDN 上读到的内容来看
  • 如何隐藏 dll 导出类中的成员变量

    我想在 dll 文件中导出一个 1024 字节的类 class declspec dllexport ExportedClass private char Data 1024 Holding 1024 bytes public void F
  • 最佳 DLL 符号转储实用程序

    我有数百个 DLL 属于一个巨大的意大利面条代码项目 需要查看它们导出或导入哪些调用 如果我能够获得 DLL 之间的依赖关系图 那就太好了 有人可以推荐我免费且可靠的实用程序吗 编辑 依赖遍历器似乎还不够 我不仅需要获取所需 DLL 的列表
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c
  • 构建错误:depfile 有多个输出路径 ninja:构建停止:子命令失败

    我在使用需要 CMake 支持的 JNI 代码构建 Java 项目时遇到此错误 该项目使用Android Studio构建 并得到NDK CMake和LLVM的支持 这些是 CMake 使用的以下标志 我实际上使用了作为 C 项目创建的项目
  • 错误:“std::this_thread”尚未声明

    我尝试使用 std this thread sleep for 函数但收到错误 error std this thread has not been declared 包括标志 GLIBCXX USE NANOSLEEP 还需要什么来强制它
  • Powershell 调用程序集委托

    我有一个用于过程控制应用程序的 dll 程序集 我在我的内部使用 load电源外壳 script 该DLL包含我需要使用的委托类型 委托名称是 X Y Delegate 我在该 DLL 中有另一个方法 应该这样调用 Method deleg
  • libSDL、CMake 和 Mac OS X Lion

    我正在尝试在我的Mac上编译cmake项目 但它取决于SDL框架 我安装了这个框架 在 cmake 之后向我报告找不到 libSDL 我自己设置了以下导出变量 按照 cmake 的建议 export SDL INCLUDE DIR Libr
  • CMake 中的 FindSDL2 发生了什么?

    我在游戏中使用 SDL2 我一直使用自定义 FindSDL2 cmake 因为标准 CMake 集中没有 然而 前段时间确实出现了有关 FindSDL2 的帖子 例子 红迪网帖子 https www reddit com r opengl
  • CMake 和 Visual Studio:如何获得快速、安静的命令行构建?

    我有一个 cmake 项目 它成功地完成了我想要的一切 但我有大约 100 个文件 当我只需要重新编译一个文件时 我厌倦了每次看到生成的巨大输出 每个文件 30 行 明确地说 我正在编译cmake build 得到这个结果 我需要传递给编译

随机推荐