从 qmake 转换为 cmake,如何以相同的方式找到库?

2023-12-08

在 qmake 中我可以有这样的东西:

LIBS += -lopengl32 \
    -lglu32 

这将自动查找 OpenGL 和 GLU 并将其与我的应用程序链接。我怎样才能在cmake中做同样的事情?是不是这么简单:

target_link_libraries(${TARGET_NAME} opengl32 glu32)

如果是这样,cmake 如何知道在哪里可以找到这些库?有没有一种方法可以做到这一点find_libraries打电话代替?上述(如果有效的话)会让我感到焦虑。


是的,有办法。

关于您提供的样品:

target_link_libraries(${TARGET_NAME} opengl32 glu32)

在这种情况下,当您仅列出要链接的库时,CMake 会将它们传递给链接器,无需任何额外的工作;链接器必须找到它们。

关于CMake包含库的方式:

然而,CMake 可能会为您提供更多帮助。请看一下下面的代码片段,它代表了在 CMake 中查找库的首选方式:

#NOTE: this is a complete & working CMakeLists.txt

project(my_opengl_program)

set(TARGET_NAME ${PROJECT_NAME})
set(TARGET_SOURCES my_opengl_program.cpp my_opengl_program.h)

add_executable(${TARGET_NAME} ${TARGET_SOURCES})

find_package(OpenGL REQUIRED)
target_link_libraries(${TARGET_NAME} OpenGL::GL OpenGL::GLU)

而不是使用find_library直接使用find_package。它将找到您需要的库(通过使用find_library内部)并为您设置各种有用的变量。

此外,大多数包还会定义所谓的导入库,OpenGL::GL and OpenGL::GLU在你的情况下,它可以用于链接。链接的美妙之处CMake 目标是您的可执行文件将从用于链接的目标继承所有相关的编译/链接要求。当然,“导入库”也是 CMake 目标:)

请注意,有NO可执行文件的附加编译/链接选项,包括目录、编译定义等。一切必需的东西都继承自OpenGL::GL and OpenGL::GLU.

CMake 还提供了以下软件包许多标准库(向下滚动到“查找模块”)。

关于搜索库

您可以随时使用find_library直接,在这种情况下,您有责任满足图书馆提出的所有要求。

确定搜索库的位置可能相当复杂,并且受各种因素驱动CMake变量以及传递给的参数find_library。最简单的情况,当没有相关的CMAKE_*变量发生变化,当使用基本语法调用 find_library 时,例如:

find_library(GL_LIB opengl32)
fund_library(GLU_LIB glu32)

搜索openGL32 and glu32将被控制CMAKE_SYSTEM_PREFIX_PATH, CMAKE_SYSTEM_LIBRARY_PATHCMake 变量。

最后,这是完整的文档查找库, 查找包, cmake 支持的库(向下滚动到“查找模块”),目标链接库

[update]

find_library 与 find_package

有人提出了关于两者之间差异的问题find_library and find_package.

简而言之,这两个命令并不“竞争”,而是相互“补充”。人们可能会想find_library作为包含库的低级接口。在此背景下,find_package将是一个更高的界面,更容易使用。另一方面,find_package需要库维护者或直接来自 CMake 的额外支持。

更深入地研究这个问题:

假设使用引入了一些库find_library (SOME_OTHER_LIB some_other_lib_name)。如果找到该库,则该变量SOME_OTHER_LIB将包含库的路径,这足以进行链接,使用target_link_libraries.

但要真正使用该库,来源需要包括SOME_OTHER_LIB特定标头,即另一个find_path(...)需要引入,以定位标头,然后是target_include_directories(...)。此外,库所需的编译选项也需要以某种方式提取,并使用引入target_compile_options(...)

当然,如果 SOME_OTHER_LIB 在多个地方使用,则所有target_include_directories, target_compile_options, and target_link_libraries必须全身使用。

对于每个使用的外国库都必须重复相同的过程。

人们可以很快发现这种模式,而这正是find_package变得方便。所有这些低级工作都对最终用户(即使用 CMake 的开发人员)隐藏,并且为她/他提供了一个干净且统一的界面。缺点是find_package需要一种“驱动程序”来“驱动”包含外部库的过程。 CMake 直接支持的所有库都可以在cmake 模块(向下滚动到“查找模块”)。

锦上添花的是,几乎所有查找模块还创建所谓的“导入库”(OpenGL::GL and OpenGL::GLU在你的情况下)是 cmake 目标,包含 3rd 方库的所有要求。所有这些数据都通过链接导入库来继承,从而使代码更加简洁。

不幸的是,对于创建的导入库的命名没有“强制执行”(只是指南),因此唯一的解决方案是检查文档。为了OpenGL模块,可以在查找OpenGL page.

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

从 qmake 转换为 cmake,如何以相同的方式找到库? 的相关文章

  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 按值“名称”合并 2 个 CSV 并合并计数 (Powershell)

    所以目前我正在寻找一种合并 2 个 CSV 文件的方法 这是我的意思的一个例子 CSV1 Name Count Klaus 3 Hans 2 Gerhard 1 Nina 6 Julia 10 Caro 19 CSV2 Name Count
  • 从 Python 控制 Libreoffice Impress

    我正在编写一个面向演讲者和会议的应用程序 我用 Python 编写并专注于 Linux 我想知道是否可以在 Linux 下使用 Python 以某种方式控制 LibreOffice Impress 我想从我的 Python 应用程序启动一个
  • iBeacon每1分钟不断进入和退出区域

    当 iBeacon 使用 Kontakt Beacon 在后台模式下进入某个区域时 我设法获得本地通知 同时 我监控 3 个具有特定且唯一标识符的信标区域 每个区域具有相同的 UUID 但具有唯一的主要和次要组合 在锁屏模式下 我的应用程序
  • C# 文本框显示以前写的文本

    例如 如果您访问 Facebook 并双击登录文本框 则会出现一些以前有人写过的登录信息 有什么方法可以在 C 文本框中生成以前输入的下拉菜单吗 我不想要组合框 See the 文本框 自动完成模式 and 文本框 自动完成源文本框的属性
  • PHP不会显示任何错误

    这是我的代码 echo foo error reporting E ALL echo this line doesnt end in a semi colon echo i should get an error here 当我运行这个时
  • PDF - Adob​​e 数字版

    我想使用 Adob e Digital Edition 保护 pdf 文档 我认为它目前被用来保护电子书以防止非法流通 任何人都可以对此有所了解吗 是否可以使用 C 或其他东西来做到这一点 您可能想看看Adobe 内容服务器和Adobe数字
  • 原子最大+原子CAS(atomicExch)

    我想问一下大家是否有更好的方法来组合2个原子 我的目标是在 J 个参数值列表 非常类似于 2 路输入 下找到一组 K 个方程 超过 32 个 的最高结果 并保存该值和 j 索引 if atomicMax max k id t max lt
  • 在 SQL Server 中禁用打印

    我有一个包含许多调试消息的脚本 这些消息由PRINT功能 有什么办法可以禁用该消息吗 我想到了类似的事情SET NOCOUNT ON 但用于用户消息 我喜欢在我的脚本 SP 中设置一个变量 Debug tinyint 默认 将其设置为 0
  • Android 如何以编程方式打开请勿打扰(dnd)

    如何在 Android 中以编程方式打开 关闭 请勿打扰 dnd 我希望这能给我一些东西 但事实并非如此 Settings System putInt getContentResolver Settings System DO NOT DI
  • 通过对象数组中的ID字段将字段值收集到数组中

    我无法修改 JSON 文件 尝试使用我所有关于循环 map filter 和条件 if else JavaScript 的知识 但什么也没有出来 请告诉我如何从此文件制作这样的文件 model 2002R Protection Pack M
  • LinearLayout 只允许添加一个视图

    layout new LinearLayout this addContentView layout new LayoutParams LayoutParams FILL PARENT LayoutParams WRAP CONTENT B
  • 如何使我的“显示和隐藏行”脚本在 Google 表格中正常运行

    我试图在 谷歌表格 工作表 Info Pull 中有一个脚本 根据 C 列的内容显示 隐藏行 目前我正在 C 列中运行以下公式 if or len H47 gt 0 len I47 gt 0 len J47 gt 0 len K47 gt
  • 无法在 ImageView 中显示来自 Firebase 存储的图像

    我有一个应用程序 允许用户将图像上传到 Firebase 存储桶 然后我获取图像文件的下载 URL 并将其添加到 Firebase 数据库中 URL 的形式为 https firebasestorage googleapis com v0
  • Python 格式抛出 KeyError

    以下代码片段 template function routes app model app get preNew className function req res res render className ejs
  • jQuery Knob 使用 animate 更新值

    我正在尝试使用 jQuery Knob 构建时钟 我的时钟正在工作 http jsfiddle net Misiu 9Whck 1 但现在我正在尝试添加一些额外的内容 一开始我想将所有旋钮设置为 0 然后使用animate我想将它们的值设置
  • 在先前的 Activity 之上显示新的 Activity,但仅部分覆盖先前的 Activity

    我有一个活动 A 它有一个 向下 按钮 见上图 当我按下此按钮时 我想在 Activity A 之上启动 Activity B 以便底部的 Activity A 的一些内容仍然可见 Activity B 可以依次启动许多其他 Activit
  • 在 Alpine Linux 上构建 glibc 时出错

    我正在尝试安装glibc在 Alpine Linux 上 我在 Docker 中运行 Alpine Linux 以下是我正在使用的步骤 docker pull alpine docker run it alpine bin sh apk a
  • ImportError:从 sklearn 导入 TfidfVectorizer 时无法导入名称 __check_build

    我正在使用 Python 2 7 10 并使用 pip 安装了 scikit 0 15 2 并且我已经安装了 numpy 1 1 10 和 scipy 0 16 0 并且它工作正常 但是当我尝试从 sklearn 导入 TfidfVecto
  • 在 app.config 中部署通过 RSAProtectedConfigurationProvider 加密的连接字符串

    如果开发人员在自己的计算机上使用 RSAProtectedConfigurationProvider 加密连接字符串 app config 部分 并且随后将其部署到用户的工作站 则该用户的工作站 或服务器 是否可以自动解密连接字符串 是否需
  • 从 qmake 转换为 cmake,如何以相同的方式找到库?

    在 qmake 中我可以有这样的东西 LIBS lopengl32 lglu32 这将自动查找 OpenGL 和 GLU 并将其与我的应用程序链接 我怎样才能在cmake中做同样的事情 是不是这么简单 target link librari