Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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嵌入必要的dylib_Xcode_Macos_Macos Sierra_Dylib - Fatal编程技术网

使Xcode嵌入必要的dylib

使Xcode嵌入必要的dylib,xcode,macos,macos-sierra,dylib,Xcode,Macos,Macos Sierra,Dylib,我正在尝试做一些非常简单和典型的事情,即在我的Xcode项目中使用动态链接库,然后在部署时嵌入所有必要的库 但是我一定是做错事了,因为Xcode 8不允许我嵌入.dylib文件,只能嵌入框架!下面的图片是当我尝试向嵌入的二进制文件添加任何内容时发生的情况,dylibs没有显示,并且添加了其他。。。将它们添加到项目中,但不添加到嵌入的二进制文件中 一定有一个非常简单的方法,但我就是找不到 结语 显然,因为我确实需要运行一个调用install\u lib\u tool的脚本,所以我制作了一个非常通

我正在尝试做一些非常简单和典型的事情,即在我的Xcode项目中使用动态链接库,然后在部署时嵌入所有必要的库

但是我一定是做错事了,因为Xcode 8不允许我嵌入.dylib文件,只能嵌入框架!下面的图片是当我尝试向嵌入的二进制文件添加任何内容时发生的情况,dylibs没有显示,并且添加了其他。。。将它们添加到项目中,但不添加到嵌入的二进制文件中

一定有一个非常简单的方法,但我就是找不到

结语

显然,因为我确实需要运行一个调用
install\u lib\u tool
的脚本,所以我制作了一个非常通用的脚本,可以将路径中包含
/local/
的任何内容更改为嵌入副本的路径:

#!/bin/sh

app=$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH
fw_path=$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH
app_dyl_list=(`ls $fw_path | grep dylib`)

function change_paths {
    local bin=$1
    echo change_path $bin
    dyl_list=(`otool -L $bin | grep local | awk '{print $1}'`)

    for dyl in ${dyl_list[*]}; do
        libname=$(basename $dyl)
        libname=${libname%%.*}
        actual_libname=(`ls $fw_path | grep $libname | xargs basename`)
        install_name_tool -change $dyl "@executable_path/../Frameworks/$actual_libname" $bin
        printf "\t%s edited\n" $actual_libname
    done
}

change_paths $app
for dyl_bin in ${app_dyl_list[*]}; do
    change_paths $fw_path/$dyl_bin
done
然后,只需在复制DYLIB之后添加一个运行脚本步骤,即可不带任何参数运行它(环境变量包含所需的所有内容)。

我从未使用“嵌入式库”,而是使用复制阶段来复制所有所需的第三方LIB以及项目中各个目标创建的LIB。您只需将要复制的动态库从“框架”和“产品”大纲节点拖到这个复制阶段(或通过“+”按钮添加它们)。如果已启用(默认情况下),XCode还会自动为每个库签名:

还可以查看“安装目录”设置。您应该将此值设置为@executable\u path/./Frameworks(前提是这是您的实际框架文件夹,至少是推荐的文件夹)。XCode使用该值设置动态库的ID,这对于正确加载动态库至关重要

您还可以使用类似的工具来检查
.app
.dylib
.framework
软件包的详细信息。它还将向您显示库所依赖的其他dylib以及它期望它们的路径。该路径必须与链接库的ID相同,否则加载将失败

另一个非常有用的工具是XCode附带的otool。它提供类似的信息,如MacDependency等。以下是动态库的依赖项列表,其中包含动态库所需的路径和版本:

Mikes-iMac:Debug mike$ otool -L libcdbc.dylib
libcdbc.dylib:
    @executable_path/../Frameworks/libcdbc.dylib (compatibility version 1.0.0, current version 1.0.0)
    @executable_path/../Frameworks/libwbbase.dylib (compatibility version 1.0.0, current version 1.0.0)
    @executable_path/../Frameworks/libgrt.dylib (compatibility version 1.0.0, current version 1.0.0)
    @executable_path/../Frameworks/libgmodule-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0)
    @executable_path/../Frameworks/libgthread-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0)
    @executable_path/../Frameworks/libglib-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0)
    @executable_path/../Frameworks/libmysqlcppconn.7.1.1.8.dylib (compatibility version 7.0.0, current version 7.1.1)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
关于加载程序路径的另一个讨论如下:


如果您创建的应用程序或库需要来自系统位置而不是相对位置的动态库,则可能意味着您将错误的库链接到了它。在“链接二进制”构建阶段,您可以选择要链接的库,选择对话框将列出所有项目目标。此外,对于链接器列表,您只需将动态库从项目大纲中的“产品”节点拖动到其中即可进行设置。对于此类LIB,设置正确路径的要求也适用。您可以通过在复制阶段后更改ID的脚本来实现这一点,也可以在其他地方保存这些LIB的副本,更改它们的ID一次(例如,在下载它们之后),然后将它们从那里复制到最终的应用程序。

嵌入DYLIB现在可以工作了(使用Xcode版本10.2检查)。 目标->框架、库和嵌入内容


请参见

我试过了,遗憾的是,在启动应用程序时,它仍然在原始/usr/local/lib/location中查找动态库,忽略了嵌入的动态库,无法正常启动。你知道如何解决这个路径问题吗?更新了我的答案。希望这能有所帮助。谢谢,不过这仍然不起作用,DYLIB被正确复制,但路径保持不变,请看这个屏幕截图哦,我的意思是我尝试添加复制阶段并更改路径,如屏幕截图所示。啊,看起来你需要设置这些第三方LIB的ID(对于您自己的DYLIB,这是在编译过程中完成的,但第三方LIB不会自动更改)。它们是在系统中安装的,因此是系统路径。但是当您想要嵌入它们时,您必须更改这些LIB的ID(请参见上面的otools输出中的glib示例)。您可以使用
安装名称工具
(例如,在应用程序的脚本构建阶段)。您是指“嵌入库”吗?非常好的消息,因为使用构建阶段的方法有一个大问题:代码签名发生在所有阶段运行之后。因此,在引入新设置之前,您可能会将LIB的未签名版本复制到应用程序包中,这导致应用程序构建失败,因为无法对应用程序进行签名。我通过insta使用了上面的纸条ll_name_工具,一切看起来都是正确的!我的问题是名称中的“LC_ID_DYLIB”所以是“cmd LC_ID_DYLIB name/usr/local/opt/cpprestsdk/lib/libcpprest.2.10.DYLIB(偏移量24)”它们在运行脚本后不会改变,我无法运行应用程序,因此我需要在我的应用程序内的opt文件夹和framework dylibs上创建一个符号链接!有什么办法可以解决吗?我在构建阶段的Xcode中也使用了上述脚本作为运行脚本,但没有结果。@MichelRouzic对此有任何更新吗?