如何在 C++ 项目的 Cmake 文件上添加 Mac OS 框架

2024-05-17

我正在尝试将外部库(Vulkan)添加到我的项目中。这个库是预编译的并且有一个框架。

我的项目树:

- build
- source
  - Entry
     - main.cpp
- include
- ext
  - vulkan
      - macos
         - include
         - lib
         - Frameworks
- CMakeLists.txt

在我的 CMakeLists.txt 中,我尝试添加我的 vulkan 库的库,如下所示:

if(APPLE)
  set(vulkan_lib_dir ${CMAKE_SOURCE_DIR}/ext/vulkan/macos/lib)
    file(GLOB LIB_VULKAN ${vulkan_lib_dir}/*.dylib )
  INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/ext/vulkan/macos/include)
endif()

进而

TARGET_LINK_LIBRARIES(my_exe  ${LIB_VULKAN})

当我使用cmake ..进而make在我的构建目录中,它工作得很好,但是当我运行我的可执行文件时./my_exe

dyld: Library not loaded: /tmp/macos-sdk-build/shaderc/src/build/libshaderc/libshaderc_shared.1.dylib
  Referenced from: /Users/benz/Documents/Dev/build/my_exe/source/Entry/./my_exe
  Reason: image not found

我想我也必须在我的 CMake 中设置框架,但我没有找到一个解决方案my_exe work.

编辑:这是我的可执行文件的 otool -L 的输出

./S2Engine:
    @rpath/libMoltenVK.dylib (compatibility version 1.0.0, current version 1.0.0)
    @rpath/libVkLayer_api_dump.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libVkLayer_core_validation.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libVkLayer_khronos_validation.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libVkLayer_object_lifetimes.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libVkLayer_stateless_validation.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libVkLayer_thread_safety.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libVkLayer_unique_objects.dylib (compatibility version 0.0.0, current version 0.0.0)
    /tmp/macos-sdk-build/shaderc/src/build/libshaderc/libshaderc_shared.1.dylib (compatibility version 1.0.0, current version 0.0.0)
    @rpath/libvulkan.1.dylib (compatibility version 1.0.0, current version 1.1.121)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 22.0.0)
    /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1350.10.0)
    /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo (compatibility version 1.2.0, current version 1.5.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1504.84.100)
    /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics (compatibility version 64.0.0, current version 1070.22.1)
    /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 775.20.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1349.93.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

这是 libvulkan.dylib 的 otool -L 的输出

libvulkan.dylib:
    @rpath/libvulkan.1.dylib (compatibility version 1.0.0, current version 1.1.121)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1560.12.0)
[100%] Linking CXX executable S2Engine
cd /Users/benz/Documents/S2EngineDEV/build/S2Engine/source/Entry && /usr/local/Cellar/cmake/3.11.3/bin/cmake -E cmake_link_script CMakeFiles/S2Engine.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/S2Engine.dir/main.cpp.o CMakeFiles/S2Engine.dir/__/Manager/EnvironmentManager.cpp.o CMakeFiles/S2Engine.dir/__/Manager/LoggerManager.cpp.o CMakeFiles/S2Engine.dir/__/Manager/MemoryManager.cpp.o CMakeFiles/S2Engine.dir/__/Manager/WindowManager.cpp.o CMakeFiles/S2Engine.dir/__/Logger/Logger.cpp.o CMakeFiles/S2Engine.dir/__/Logger/FileLog.cpp.o CMakeFiles/S2Engine.dir/__/Memory/Memory.cpp.o CMakeFiles/S2Engine.dir/__/Memory/StackAllocator.cpp.o CMakeFiles/S2Engine.dir/__/Window/Window.cpp.o CMakeFiles/S2Engine.dir/__/Window/PatternWindow.cpp.o CMakeFiles/S2Engine.dir/__/Window/PatternGLFW3_VULKAN.cpp.o  -o S2Engine -Wl,-rpath,/Users/benz/Documents/S2EngineDEV/ext/vulkan/macos/lib ../../../ext/glfw33/src/libglfw3.a ../../../../ext/vulkan/macos/lib/libMoltenVK.dylib ../../../../ext/vulkan/macos/lib/libSPIRV-Tools-shared.dylib ../../../../ext/vulkan/macos/lib/libVkLayer_api_dump.dylib ../../../../ext/vulkan/macos/lib/libVkLayer_core_validation.dylib ../../../../ext/vulkan/macos/lib/libVkLayer_khronos_validation.dylib ../../../../ext/vulkan/macos/lib/libVkLayer_object_lifetimes.dylib ../../../../ext/vulkan/macos/lib/libVkLayer_stateless_validation.dylib ../../../../ext/vulkan/macos/lib/libVkLayer_thread_safety.dylib ../../../../ext/vulkan/macos/lib/libVkLayer_unique_objects.dylib ../../../../ext/vulkan/macos/lib/libshaderc_shared.1.dylib ../../../../ext/vulkan/macos/lib/libshaderc_shared.dylib ../../../../ext/vulkan/macos/lib/libvulkan.1.1.121.dylib ../../../../ext/vulkan/macos/lib/libvulkan.1.dylib ../../../../ext/vulkan/macos/lib/libvulkan.dylib -framework Cocoa -framework IOKit -framework CoreFoundation -framework CoreVideo 
[100%] Built target S2Engine
/usr/local/Cellar/cmake/3.11.3/bin/cmake -E cmake_progress_start /Users/benz/Documents/S2EngineDEV/build/CMakeFiles 0

您正在链接../../../../ext/vulkan/macos/lib/libshaderc_shared.dylib如果你跑了otool -L在它上面你无疑会看到它认为它被称为/tmp/.../libshaderc_shared.dylib这是问题的根本原因(它基本上告诉运行时链接器从哪里获取该库)。

该文件已损坏,您只能通过运行来修复它install_name_tool将其重命名为使用@rpath像其他图书馆一样。

但是您不需要链接所有这些库,因此只需更改CMakeLists.txt文件仅链接到libvulkan.dylib:

if(APPLE)
  set(LIB_VULKAN ${CMAKE_SOURCE_DIR}/ext/vulkan/macos/lib/libvulkan.dylib)
  INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/ext/vulkan/macos/include)
endif()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C++ 项目的 Cmake 文件上添加 Mac OS 框架 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 如何从 R 数据框中提取关键字

    我是 R 中文本挖掘的新手 我想从数据框的列中删除停用词 即提取关键字 并将这些关键字放入新列中 我尝试制作一个语料库 但它对我没有帮助 df C3是我目前拥有的 我想添加栏目df C4 但我无法让它工作 df lt structure l
  • python:API 令牌生成及其危险

    我正在按照 Flask Web Development 一书来实现基于令牌的身份验证 基本上 用户使用 HTTP 基本身份验证对其进行身份验证 并为其生成令牌 s Serializer app config SECRET KEY expir
  • 如何使用 adb 在设备上安装现有的 Android 应用程序?

    在开发过程中 我使用类似的东西 adb s 192 168 1 77 5555 uninstall com myApp app adb s 192 168 1 77 5555 install path to android debug ap
  • 停止从标准输入读取

    我正在用 LInux C 编写一个简单的控制台应用程序 它接受来自命令行的用户输入 我在用std getline std cin std cin gt gt text在一个线程中 10 秒后 我想停止接受控制台输入并写一条短信 然后做其他事
  • pandas 中的滚动减法

    我正在尝试做类似的事情 ff pd DataFrame uid 1 1 1 20 20 20 4 4 4 date 09 06 10 06 11 06 09 06 10 06 11 06 09 06 10 06 11 06 balance
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • 用PLY解析python,如何编码缩进和缩进部分

    我试图用 PLY 解析 python 语言的函数定义 我遇到了与缩进相关的问题 例如 对于 for 语句 我希望能够知道块何时结束 我在这里阅读了python语法 http docs python org 2 reference gramm
  • 根据复选框和数据元素隐藏/显示表格行

    我想隐藏表中的行 因为我选中了复选框并且该数据元素在表中不正确 另一个实验 我还可以使用数据元素进行排序并按下拉列表排序 查看 tr 标签 价格 名称 评级 吗 div class filter list div
  • C++ 中的 min= 习惯用法?

    We use x y 代替 x x y 同样对于 和其他运营商 嗯 那又怎样呢 x min y 代替 x std min x y 该命令是否有一个常用的习惯用法 不需要使用另一个运算符对语言进行 不可能的 扩展 这当然不是惯用的 但你也许可
  • 在 JavaScript 中生成 RSA 密钥对

    我最近发现了这个 RSA JavaScript 库 http www ohdave com rsa http www ohdave com rsa 但是 它要求预先生成密钥 这是我的问题 问题 我想在 JavaScript 中生成 RSA
  • 在 MS Word 中运行外部 vba 代码

    我可以将外部代码链接到 Word 文档吗 我有很多带有宏的 Word 文档 VBA 代码 全部使用相同的代码 我希望代码从外部源运行 而不是从所有这些文档中运行 这样 如果我必须更新代码 我只有一个地方需要更新 您可以创建一个模板并将其放入
  • Google Firebase - 如何删除崩溃报告?

    我最终失明了吗 还是没有明显的方法可以通过 Google Firebase Web 控制台删除 Firebase 崩溃报告 我的 Android 应用程序已成功记录报告 但现在出现大量 开发崩溃 占用了我在控制台中的大部分视图 这使得找到实
  • 如何调整 Seaborn 箱线图中胡须的大小?

    我想在下面的箱线图中使须线更宽 import pandas as pd import numpy as np import seaborn as sns import matplotlib pyplot as plt data pd Dat
  • 使用 pkg:sjPlot 函数创建一个生成部分斜体单元格的数据框

    我正在尝试创建一个简单的数据表 其中 Coral taxon 列中的属名称为斜体 而 spp 列中的属名称为斜体 属名后面的部分不大写 我尝试使用 expression 函数对 Coral taxon 的每一行进行编码 但没有成功 sum
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • 如何制作 github PR 请求审查整个文件?

    有这个问题 https github com isaacs github issues 284这是相关的 允许对更改集之外的部分代码进行注释 我只是想知道是否有人有聪明的解决方法或流程来实现类似的 也许更简单的事情 因此 我有一组不同的文件
  • 如何更改 FacetGrid 中的边距标题颜色

    使用 Seaborn Facet Grids 如何仅更改边距标题的颜色 注意g set titles color red 更改两个标题 p sns load dataset penguins sns displot data p x fli
  • 将消息从 AWS Lambda 发布到 AWS IoT

    我正在尝试使用 Nodejs 将消息从 AWS Lamba 发布到 AWS IoT 我已压缩该项目并上传到 AWS IoT 下面是代码片段 var awsIot require aws iot device sdk var device a
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何在 C++ 项目的 Cmake 文件上添加 Mac OS 框架

    我正在尝试将外部库 Vulkan 添加到我的项目中 这个库是预编译的并且有一个框架 我的项目树 build source Entry main cpp include ext vulkan macos include lib Framewo