Xcode 部署cocoa应用程序及其C++;dylib如何包装它们?
我不熟悉可可和苹果的开发。我编写了一个应用程序,它是COOTA框架和Objy-C的结合,在C++库DyLIB 中编写的后端。Xcode 部署cocoa应用程序及其C++;dylib如何包装它们?,xcode,macos,cocoa,Xcode,Macos,Cocoa,我不熟悉可可和苹果的开发。我编写了一个应用程序,它是COOTA框架和Objy-C的结合,在C++库DyLIB 中编写的后端。 我使用XCODE 4.6,上面有两个项目COCOA应用程序和我的C++库。C++也是我自己的项目。 现在是部署的时候了。我想为它做一个pkg安装程序。 我可以在XCODE 4.6中运行/调试它,因为我在Objo C项目设置中添加了搜索库路径,作为C++项目的输出目录。因此,它可以找到依赖项并运行而不会崩溃 现在在xcode中的Objective-C项目树中,我看到了pro
我使用XCODE 4.6,上面有两个项目COCOA应用程序和我的C++库。C++也是我自己的项目。 现在是部署的时候了。我想为它做一个pkg安装程序。 我可以在XCODE 4.6中运行/调试它,因为我在Objo C项目设置中添加了搜索库路径,作为C++项目的输出目录。因此,它可以找到依赖项并运行而不会崩溃
现在在xcode中的Objective-C项目树中,我看到了products->mysoftware.app文件。如果我在finder中找到这个mysoftware.app文件的位置并运行它,它就会崩溃。我打开此应用程序文件的软件包内容,看到以下内容 contents\(info.plist, MacOS, pkginfo, resources )
<> p>我没有看到我的C++库,当我运行MyStudial.App时,直接点击它崩溃,因为它找不到DyLIB,我看到了报告窗口中的堆栈跟踪,它找不到DyLIB,抱怨库没有找到Ur/Posi/Lib/MyLyb DyLIB。
我还手动将dylib文件放在MacOS的.app中,我的可执行文件所在的位置,希望它能从同一个目录中找到该库,但它没有,上面给出了相同的消息,并从sane位置/usr/local/lib/mylib.dylib查看
所以我的问题是如何解决.app包对部署的依赖关系,我是否需要将动态库放在.app包中?我如何做到这一点,然后我的下一步将是把这个单一的.app东西放在pkg安装程序中
谢谢我解决了这个问题,所以我提出这个答案是为了帮助其他想这样做的人。 动态库必须放在应用程序包中的一个子文件夹中(即
mysoftware.app
)。可以是MacOS
、Frameworks
或我们决定放入的任何子文件夹
第一步是在dylib的目标设置中,我们将安装路径设置为相对于应用程序包(mysoftware.app),因此在lib的Xcode目标设置中,我将其设置为:
@executable_path/../frameworks
您还可以使用@rpath
(您可能想研究一下,我认为它比@executable\u path
更灵活)
Xcode还将更改动态库的安装名称
然后在Objective-C项目中,使用项目设置->构建阶段->链接->中的动态库,我们将动态库从动态库项目的产品节点拖动到这里
在Objective-C/Cocoa项目中,最后一步是添加名为copy files的构建步骤,它应该显示一个组合框,告诉您捆绑包的目标文件夹。我将其设置为frameworks(这将取决于您在设置动态库的安装路径时选择的相对路径)。“复制文件”构建步骤的第二部分是提供要复制的源文件。这是我们要打包到bundle的Frameworks文件夹中的dylib文件。因此,将动态库文件从(您的动态库项目的)产品拖到构建步骤的源文件
就这样
现在,当我们构建Objective-C或Cocoa项目时,如果我们的构建步骤和install\u path
等配置正确,那么它应该构建良好。成功构建Cocoa项目后,转到Products->mysoftware.app->Locate in the Finder,当您运行它时,它应该运行良好。因为依赖项动态库位于捆绑包的Frameworks文件夹中,并且链接正确。您可以查看捆绑包的包内容,以查看Frameworks文件夹是否包含您的dylib文件
令我惊讶的是,存储动态库的路径必须是动态库的一部分。因此,当一个项目链接到这个动态库时,它会复制自身相同的路径,因此当我们运行链接到该动态库的Cocoa应用程序时,它会在它从动态库内部复制的路径上查找它,我们负责告诉动态库它存在的位置。以安装路径
等形式
有一些工具可以使用该动态库手动更新存储在Cocoa项目中的动态库的安装路径。如果使用这些工具更新现有捆绑包的路径,则应该在动态库的客户端中进行更改,而不是在动态库本身中进行更改
如果我们有代码,那么我们可以按照上面的说明在Xcode中更改它
例如,otool-L my.dylib
可用于查看现有二进制库的动态库安装路径
install\u name\u tool-change
可用于更新现有二进制库的安装路径这对我来说很有用:
请注意,您不需要更改动态库本身的任何内容,它可以从其他地方提供。是的,链接器依赖于一些复杂的东西,您可能应该首先查看文档中提到@rpath的任何内容
MYLIBNAME=libmylib.dylib
install_name_tool -change /usr/local/lib/$MYLIBNAME @executable_path/../Frameworks/$MYLIBNAME "$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH"