【问题标题】:How to get CMake to embed a private framework into a macOS app bundle?如何让 CMake 将私有框架嵌入到 macOS 应用程序包中?
【发布时间】:2021-07-09 01:50:23
【问题描述】:

target_link_libraries 可以很好地链接私有框架,但它无法将框架复制到应用程序包的 Frameworks 目录中。它也没有办法更新可执行文件到框架的路径。

所以本质上我需要 CMake 来:

  1. 与私有 dylib 链接。
  2. 将该 dylib 复制到应用程序包的 Frameworks 目录中。
  3. 将可执行文件的路径更新到 dylib。

【问题讨论】:

标签: cmake


【解决方案1】:

我决定为最终的可执行文件编写自己的 rpath。为了防止 CMake 编写构建 rpaths 集CMAKE_SKIP_BUILD_RPATH。这需要在 add_executable 之前设置。

set(CMAKE_SKIP_BUILD_RPATH TRUE)

然后我将所有想要嵌入的 dylib 复制到构建的 app bundle 的 Frameworks 目录中。在这种情况下,我正在复制存储在项目中的 MoltenVK。 ${PROJECT_NAME} 是可执行文件名。

set(APP_BUNDLE_CONTENTS_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app/Contents")
set(APP_BUNDLE_FRAMEWORKS_DIR "${APP_BUNDLE_CONTENTS_DIR}/Frameworks")

file(GLOB VULKAN_DYLIB_PATHS "${CMAKE_SOURCE_DIR}/external/vulkan/builds/mac/*")
target_link_libraries(${PROJECT_NAME} ${VULKAN_DYLIB_PATHS})
file(COPY ${VULKAN_DYLIB_PATHS} DESTINATION ${APP_BUNDLE_FRAMEWORKS_DIR})

然后我将 rpath 作为构建后命令添加到可执行文件。

add_custom_command(TARGET ${PROJECT_NAME} 
    POST_BUILD COMMAND 
    install_name_tool -add_rpath "@executable_path/../Frameworks/"
    "${APP_BUNDLE_CONTENTS_DIR}/MacOS/${PROJECT_NAME}")

这适用于使用 CMake 进行构建和调试。这在生成 Xcode 项目时不起作用。希望我能找到一种更清洁的方法,但目前可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多