代码之家  ›  专栏  ›  技术社区  ›  jestro

如何让CMake将私有框架嵌入macOS应用包?

  •  0
  • jestro  · 技术社区  · 3 年前

    target_link_库可以链接私有框架,但无法将框架复制到应用包的frameworks目录中。它也没有办法更新可执行文件到框架的路径。

    所以本质上我需要CMake:

    1. 与私人动态链接。
    2. 将该动态库复制到应用程序包的Frameworks目录中。
    3. 更新可执行文件到动态库的路径。
    0 回复  |  直到 3 年前
        1
  •  0
  •   jestro    3 年前

    我决定将自己的RPATH写入最终的可执行文件。防止CMake写入生成路径集 CMAKE_SKIP_BUILD_RPATH 。这需要在添加_可执行文件之前设置。

    set(CMAKE_SKIP_BUILD_RPATH TRUE)
    

    然后我复制所有我想嵌入到内置应用包框架目录中的dylib。在本例中,我正在复制存储在项目中的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项目时不起作用。希望我能找到一个更好更干净的方法,但这目前还有效。