我决定为最终的可执行文件编写自己的 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 项目时不起作用。希望我能找到一种更清洁的方法,但目前可行。