Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Cocoa 将动态库路径设置为XCode构建步骤_Cocoa_Xcode_Shared Libraries - Fatal编程技术网

Cocoa 将动态库路径设置为XCode构建步骤

Cocoa 将动态库路径设置为XCode构建步骤,cocoa,xcode,shared-libraries,Cocoa,Xcode,Shared Libraries,我有一个Cocoa应用程序作为XCode项目,它有一些补充功能作为动态库目标 当XCode构建项目时,它将所有构建输出放在一个文件夹中:app包和dylib文件。当从XCode调试器执行时,.app启动 但是,我无法从finder启动应用程序 如何设置XCode以在独立状态下“部署”应用程序?我发现我可以在实际的应用程序二进制文件上使用ld来包含dylibs的相对路径:@executable\u path/。/../mylib.dylib 在每次构建之后运行一个脚本似乎是错误的:一定有某种方法(

我有一个Cocoa应用程序作为XCode项目,它有一些补充功能作为动态库目标

当XCode构建项目时,它将所有构建输出放在一个文件夹中:app包和dylib文件。当从XCode调试器执行时,.app启动

但是,我无法从finder启动应用程序

如何设置XCode以在独立状态下“部署”应用程序?我发现我可以在实际的应用程序二进制文件上使用
ld
来包含dylibs的相对路径:
@executable\u path/。/../mylib.dylib

在每次构建之后运行一个脚本似乎是错误的:一定有某种方法(我完全不知道)可以从XCode内部轻松地做到这一点——这肯定是一个常见的问题吧


看起来XCode支持在目标信息>构建>链接>动态库安装名称设置(LD\u DYLIB\u Install\u Name)中使用@executable\u path、@loader\u path和@rpath

帮助文本显示:“在动态库中设置内部“安装路径”(LC_ID_DYLIB)。任何与库链接的客户端都会将该路径记录为dyld定位此库的方式”

这看起来很有希望,但是如果我需要在多个路径中将DYLIB链接到一个公共库,那么可用性就是一个问题——每次相对路径都会不同


从finder运行testapp时,我得到以下(相关)错误文本

Dyld Error Message:
  Library not loaded: @executable_path/../../util.dylib
  Referenced from: /Volumes/data/Code/TestApp/build/Debug/TestApp.app/Contents/MacOS/TestApp
  Reason: image not found

util.dylib位于/Volumes/data/Code/TestApp/build/Debug/中,因此我感到困惑://

在构建应用程序时,您应该使用复制文件构建阶段将dylib复制到应用程序的捆绑包中。您需要将其复制到框架中。然后,您可以将安装路径设置为
@executable\u path/。/Frameworks/mylib.dylib

项目由多个.app捆绑包组成,因此公共dylib必须位于.app捆绑包之外。除非有一种巧妙的方法可以轻松地将多个可执行文件合并到一个.app包中,我还需要研究:PYou应该将动态库复制到每个app包中。或者您可以单独安装它,在这种情况下,您应该知道它将位于何处(
/usr/local/lib
或其他)。请注意,如果应用程序引用的动态库未包含在其捆绑包中或用户文件系统上的公共位置,则不会运行这些应用程序。