Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 部署cocoa应用程序及其C++;dylib如何包装它们?_Xcode_Macos_Cocoa - Fatal编程技术网

Xcode 部署cocoa应用程序及其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

我不熟悉可可和苹果的开发。我编写了一个应用程序,它是COOTA框架和Objy-C的结合,在C++库DyLIB

中编写的后端。

我使用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"