【问题标题】:how to add Mac OS Framework on Cmake file for C++ project如何在 C++ 项目的 Cmake 文件中添加 Mac OS 框架
【发布时间】:2019-11-06 11:08:51
【问题描述】:

我正在尝试将外部库 (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 工作的解决方案。

编辑:这是我的可执行文件的 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)

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

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

【问题讨论】:

  • 在您的可执行文件和libvulkan.dylib 上显示otool -L 的输出。
  • 我已经用输出编辑了我的帖子..
  • 那么问题是/tmp/macos-sdk-build/shaderc/src/build/libshaderc/libshaderc_shared.1.dylib 库中的链接是什么?
  • 不知道,第一次在linkind共享库的时候出现这种问题。没有什么是文件夹/tmp/macos-sdk-build/
  • 您的问题与 cmake 无关,因为它似乎工作正常。您需要显示链接器行以查看是否显示该库的任何迹象。但是,如果在构建过程中缺少该文件,它会完全链接,这很奇怪。但是我知道你不应该链接所有这些 libVkLayer 库,而只是链接 libvulkan.dylib

标签: c++ cmake sdk frameworks vulkan


【解决方案1】:

您正在链接../../../../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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多