应用程序包中的动态库Mac OS X.

时间:2011-09-19 12:03:58

标签: c++ xcode

我在我的应用程序中使用动态库,现在我需要将此应用程序分发给用户。我想将所有动态库放在bundle中,而不是在lib,usr / lib等中安装动态库,这样它就可以进行干净的部署并且易于维护。 问题是当我把动态库放在Xcode应用程序中作为一个不起作用的框架时。请帮我怎么做? 我想确保我的应用程序使用bundle中的动态库而不是系统库。请建议

1 个答案:

答案 0 :(得分:7)

Dunno如果有办法在Xcode内部指定,但对于我们的应用程序,我们使用包含如下代码的构建脚本。该代码使用Apple的install_name_tool实用程序来修改应用程序,以便它不是指向/usr/lib/libsndfile.so,而是指向应用程序包中的libsndfile.so路径。

请注意,这只是一个简短的脚本摘录,可以给你一个想法;它可能需要一些调整才能为你工作(当然你需要修改它来操作libsndfile以外的其他库,如果这是你想要的):

#!/bin/bash -e

BINARY="MyAppFolder/MyAppName"
FRAMEW_FOLDER="MyAppFolder/MyAppName/Contents/Frameworks/"

function DoInstallNameTool {
    xLIB="$1"
    xLIB_NAME="$2"
    xBINARY="$3"
    echo install_name_tool -change \"${xLIB}\" \"@executable_path/../Frameworks/${xLIB_NAME}\" \"${xBINARY}\"
    install_name_tool -change ${xLIB} "@executable_path/../Frameworks/${xLIB_NAME}" "${xBINARY}"
}

for LIB in $(otool -L "${BINARY}"|grep libsndfile|cut -d '(' -f -1)
do
    echo "Handling Lib: $LIB"
    LIB_NAME=$(basename "$LIB")
    echo "    Adding ${LIB_NAME}"
    cp -Rf "${LIBSNDFILE_DIR}/src/.libs/${LIB_NAME}" "${FRAMEW_FOLDER}"

    DoInstallNameTool "$LIB" "$LIB_NAME" "$BINARY"
done

脚本运行后,您可以执行

otool -L ./MyApp.app/Contents/MacOS/MyApp

打印出应用所依赖的所有共享库,以验证脚本是否有效(或者如果它不起作用,看看应用程序仍然动态链接到哪个/ usr / lib / *库)