如何在C ++文件的Cmake文件上添加Mac OS Framework [英] how to add Mac OS Framework on Cmake file for C++ project

查看:1336
本文介绍了如何在C ++文件的Cmake文件上添加Mac OS Framework的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to add an external library (Vulkan) to my project. This library is pre-compiled and has a framework.

我的项目树:

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

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

In my CMakeLists.txt, I try to add the lib of my vulkan lib like this:

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

When I use cmake .. and then make on my build directory, it works perfectly but when I run my executable ./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 起作用的解决方案。

I think I have to set the framework in my CMake too, but I did not find a solution that made my_exe work.

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

EDIT : this is the output of otool -L of my executable

./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的输出

this is the output of 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


推荐答案

您正在链接 ../../../../ ext / vulkan / macos / lib / libshaderc_shared.dylib ,如果已运行 otool -L 毫无疑问,它认为它被称为 / tmp /.../ libshaderc_shared.dylib 这是问题的根本原因(它基本上告诉运行时链接程序从何处获取该库)。

You are linking in ../../../../ext/vulkan/macos/lib/libshaderc_shared.dylib and if you ran otool -L on it you would no doubt see that it thinks it's called /tmp/.../libshaderc_shared.dylib which is the root-cause of your issue (it basically tells the runtime linker where to fetch that library from).

该文件已损坏,您只能修复它通过在其上运行 install_name_tool 对其重命名,使其像其他库一样使用 @rpath

That file is broken and you can only fix it by running install_name_tool on it to rename it to use @rpath like the other libraries.

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

But you don't need to be linking against all those libraries so simply change the CMakeLists.txt file to only link against 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()

这篇关于如何在C ++文件的Cmake文件上添加Mac OS Framework的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆