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