使用CMake将.frameworks复制到iOS应用程序包

问题描述 投票:10回答:1

我最近使用的库转换为.framework分发。

在我现有的CMake文件中,我已成功将其与我的iOS应用程序链接,但我得到:

dyld: Library not loaded: @rpath/Pizza.framework/Pizza
  Referenced from: /var/mobile/Containers/Bundle/Application/D71ED298-C287-4B2F-8AFA-710A14C06D75/pizzashop.app/pizza
  Reason: image not found

当我从Xcode安装它。如果我手动将它添加到我的xcode项目,在“嵌入式​​二进制文件”部分,那么我很好(见下图)

enter image description here

所以我得出结论,问题是将.framework放入我的应用程序包中。我遇到了this question并查看了链接的QT示例,但我仍然试图在这里定位自己,因为我发现语法有点不透明。

CMake的BundleUtilities是我想在这里使用的吗?在查看BundleUtilities示例时,我有点迷失:

set(APPS ...)  # paths to executables
set(DIRS ...)   # directories to search for prerequisites
INSTALL(CODE "
   include(BundleUtilities)
   fixup_bundle(\"${APPS}\"   \"\"   \"${DIRS}\")
   " COMPONENT Runtime)

这是OSX特定的,还是可以像iOS一样应用它?

ios xcode frameworks cmake
1个回答
4
投票

我们最终没有找到理想的解决方案,最终手动操作比首选更多:

  1. 我们添加了一个自定义命令,我们在构建完成后运行,但在打包之前(参见CMake的add_custom_command)。
  2. 自定义命令执行以下操作: 在我们的app bundle文件夹下创建一个Frameworks目录(确保它在包装过程中被复制的地方)。 我们使用cp -aH将所有框架复制到此Frameworks目录中 然后,我们使用:codesign --force --verbose Computers.framework --sign "$2"重新签名此目录中的每个框架
  3. 将Frameworks目录添加到搜索路径:
set_target_properties(${EXE_NAME} PROPERTIES 
        XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks")
© www.soinside.com 2019 - 2024. All rights reserved.