【问题标题】:Packaging software with dependencies - How deep should I go?打包具有依赖关系的软件——我应该走多远?
【发布时间】:2016-12-09 17:40:39
【问题描述】:

我正在开发一个跨平台软件,并希望将其作为 zip 包分发。

对于 Linux,我不会将依赖项与包一起打包,对于 Windows,我也会在包中分发 dll。

对于 Mac OS X,我有一个脚本,可以递归地将所有 dylib 文件复制到构建文件夹并更改链接。

当然,这会导致我可能不应该打包的文件列表,例如libsystem_malloc.dylib, libremovefile.dylib.

我应该只选择安装在/usr/local/* 中的 dylib,还是有任何其他系统方法不包含每个 OS X 安装中可用的文件?

如果有帮助的话,大多数(好吧,暂时全部)依赖项是 Homebrew 包。

对于任何感兴趣的人,这是用于递归复制和重新链接的 bash 代码:

while true; do
    INSTALLED=0
    for dylib in *.dylib; do
        LIBS=`otool -L $dylib`
        if [ "x$LIBS" != "x" ]; then
            echo "$dylib is using:"
            for lib in $LIBS{@:2}; do
                if echo $lib | grep --quiet 'dylib$'; then
                    echo "    $lib"
                    new_lib=`echo $lib | sed 's|.*/\(.*\.dylib\)|\1|'`
                    if [ -e  $PD_APP_LIB/$new_lib ]; then
                        echo "$PD_APP_LIB/$new_lib already exists, skipping copy."
                    else
                        install -vp $lib $PD_APP_LIB
                        INSTALLED=1
                    fi
                    install_name_tool -id @loader_path/$new_lib $PD_APP_LIB/$new_lib
                    install_name_tool -change $lib @loader_path/$new_lib $dylib
                fi
            done
            echo " "
        fi
    done
    if [ $INSTALLED -eq 0 ]; then
        break
    fi
done

【问题讨论】:

    标签: macos packaging external-dependencies


    【解决方案1】:

    目前,我只打包来自/usr/local/的库,脚本是:

    while true; do
        INSTALLED=0
        for dylib in *.dylib; do
            LIBS=`otool -L $dylib`
            if [ "x$LIBS" != "x" ]; then
                echo "$dylib is using:"
                for lib in $LIBS{@:2}; do
                    # The following line has been changed
                    if echo $lib | grep --quiet '^/usr/local/.*dylib$'; then
                        echo "    $lib"
                        new_lib=`echo $lib | sed 's|.*/\(.*\.dylib\)|\1|'`
                        if [ -e  $PD_APP_LIB/$new_lib ]; then
                            echo "$PD_APP_LIB/$new_lib already exists, skipping copy."
                        else
                            install -vp $lib $PD_APP_LIB
                            INSTALLED=1
                        fi
                        install_name_tool -id @loader_path/$new_lib $PD_APP_LIB/$new_lib
                        install_name_tool -change $lib @loader_path/$new_lib $dylib
                    fi
                done
                echo " "
            fi
        done
        if [ $INSTALLED -eq 0 ]; then
            break
        fi
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多