2

我是可可和 mac 开发的新手。我编写了一个应用程序,它结合了使用可可框架的 Objective-C 和用 C++ 库 dylib 编写的后端。

我正在使用 xcode 4.6 并拥有上述两个项目 Cocoa 应用程序和我的 C++ 库。C++也是我自己的项目。

现在是部署的时候了。我想为它制作一个 pkg 安装程序。我可以在 xcode 4.6 中运行/调试它,因为我在 object-c 项目设置中添加了搜索库路径作为 C++ 项目的输出目录。因此它可以找到依赖项并运行而不会崩溃。

现在在 xcode 内的 Objective-C 项目树中,我看到 products -> mysoftware.app 文件。如果我在 finder 中找到这个 mysoftware.app 文件的位置并运行它,它就会崩溃。我打开这个应用程序文件的包内容,我看到内容如下结构

   contents\(info.plist, MacOS, pkginfo, resources )

我在那里看不到我的 C++ 库,当我直接运行 mysoftware.app 时,双击它会崩溃,因为它找不到 dylib 我在报告窗口中看到堆栈跟踪它找不到 dylib,抱怨找不到该库 usr/ local/lib/mylib.dylib 我还手动将 dylib 文件放在我的可执行文件所在的 MacOS 中的 .app 中,希望它会从同一目录中找到 lib,但它没有,在上面给出了相同的消息并查看从理智的位置 /usr/local/lib/mylib.dylib

所以我的问题是如何解决 .app 包的部署依赖关系,我是否需要将 dylib 放在 .app 包中?我该怎么做,然后我的下一步是将这个单一的 .app 东西放在 pkg 安装程序中,

谢谢

4

2 回答 2

2

这对我有用:

  1. 将 dylib 拖到您的框架中。
  2. 添加一个 Copy Files 构建阶段,目标框架并将 dylib 放在那里。
  3. 添加具有以下脚本的运行脚本阶段:

MYLIBNAME=libmylib.dylib
install_name_tool -change /usr/local/lib/$MYLIBNAME @executable_path/../Frameworks/$MYLIBNAME  "$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH"

而已。该脚本告诉您的应用程序从正确的位置加载 dylib - 否则它将抱怨在运行时找不到 dylib。

请注意,您不需要更改 dylib 本身的任何内容 - 它可以从其他地方提供。

于 2014-04-19T15:46:11.787 回答
0

我解决了这个问题,所以我提出这个答案是为了帮助其他想要做同样事情的人。dylib 必须放在应用程序包中的一个子文件夹中(即mysoftware.app)。可以是MacOSFrameworks或者我们决定放入的任何子文件夹。

第一步是在我们的 dylib 的目标设置中,我们将安装路径设置为相对于应用程序包(mysoftware.app),因此在 lib 的 Xcode 目标设置中我将其设置为:

@executable_path/../frameworks  

您也可以使用@rpath(您可能想对此进行研究,我认为它比 更灵活@executable_path

Xcode 也会为我们的 dylib 更改安装名称。

然后在 Objective-C 项目中使用我们的 dylib 在项目设置 -> 构建阶段 -> 链接 -> 我们从 dylib 项目的产品节点将我们的 dylib 拖到这里。

在 Objective-C/Cocoa 项目中,最后一步是添加一个名为 copy files 的构建步骤,它应该显示一个组合框,告诉您包的目标文件夹。我将它设置为框架(这将取决于您在设置 dylib 的安装路径时选择的相对路径)。“复制文件”构建步骤的第二部分是提供要复制的源文件。那就是我们想要打包到包的 Frameworks 文件夹中的 dylib 文件。因此,将 dylib 文件从(您的 dylib 项目的)产品中拖到构建步骤的源文件中。

就是这样。

现在,当我们构建 Objective-C 或 Cocoa 项目时,如果我们的构建步骤和install_path等配置正确,它应该可以正常构建。成功构建 Cocoa 项目后,转到 Products -> mysoftware.app -> Locate in Finder,当你运行它时,它应该运行良好。由于依赖项 dylib 位于包的 Frameworks 文件夹中并正确链接。您可以查看捆绑包的包内容以查看 Frameworks 文件夹是否包含您的 dylib 文件。

令我惊讶的是,存储 dylib 的路径必须是 dylib 的一部分。因此,当一个项目链接到这个 dylib 时,它本身会复制相同的路径,所以当我们运行链接到该 dylib 的 Cocoa 应用程序时,它将在它从 dylib 内部复制的完全相同的路径中查找它,我们负责告诉 dylib 它在哪里。install_path等的形式

有一些工具可以使用该 dylib 手动更新存储在 Cocoa 项目中的 dylib 安装路径。如果使用这些工具更新现有包的路径,则应在 dylib 的客户端中进行更改,而 dylib 本身不需要。

如果我们有代码,那么我们可以按照上面的说明在 Xcode 中更改它。

otool -L my.dylib例如可用于查看现有二进制库的 dylib 安装路径

install_name_tool -change可用于更新现有二进制库的安装路径

于 2013-07-09T13:05:06.757 回答