【问题标题】:How do I include libxslt in my iPhone app?如何在我的 iPhone 应用程序中包含 libxslt?
【发布时间】:2010-09-04 04:24:34
【问题描述】:

我听说包含 libxslt.dylib 会导致您的应用被拒绝。我不知道这有多准确。

不过,我想包含最新版本的 libxslt。我想对 libxml2 以及将来的其他库做同样的事情。

在我的应用中包含这样的代码库的正确方法是什么?

【问题讨论】:

    标签: iphone xcode libxml2 libxslt


    【解决方案1】:

    我的应用被 Apple 拒绝,并显示以下消息。


    XYZ 应用无法发布到 App Store,因为它使用私有或未记录的 API:

    私有符号引用 xsltApplyStylesheet xsltCleanupGlobals xsltFreeStylesheet xsltInit xsltParseStylesheetFile xsltSaveResultToString

    如您所知,如 iPhone 开发者计划许可协议第 3.3.1 节所述,不允许使用非公共 API。在应用审核团队审核您的应用之前,请解决此问题并将新的二进制文件上传到 iTunes Connect。


    据我了解,libxslt 和 libxml2 库实际上存在于设备上,并且可以通过 Xcode 中的下拉菜单获得。我与这两个库动态链接链接,我的应用程序在设备上运行良好。因此,库必须在设备上。为什么我需要从头开始将这些库构建为静态库并增加我的应用程序的大小?

    除了不使用 xml 和 xslt 之外,我找不到任何明确的解决方法。这根本没有意义!

    Hilton,您是否成功地向 iTunes 提交了使用 xslt 的应用程序?

    【讨论】:

    • 我还没有提交使用它的应用程序。我确实将 libxslt 库静态链接到我的应用程序中。希望他们的私有 API 分析器能够区分这两种用法。
    • 所以我现在已经将 libxslt 和 libxml 编译成静态库并将它们合并到我的应用程序中。他们工作得很好,但应用商店出于同样的原因拒绝了我的应用。我怀疑他们没有区分使用他们的私有 API 和使用我自己的集成库。有什么建议吗?
    【解决方案2】:

    我终于在 Xcode 中构建了 libxslt,链接到我的应用,并避开了应用商店拒绝机器人。

    基本上,您必须静态构建 libxslt 并更改符号名称,以便它们与 Apple 查找的名称不匹配。所有符号 xsltFoo() 必须更改为 zsltFoo()。此外,库本身的名称必须从 libxslt.a 更改为 libzslt.a

    这里有一个简单的 10 个步骤:)

    1. 创建一个libxslt 子目录并将libxslt-1.1.26.tar.gz 放入其中。
    2. 右键单击 Target -> YourApp 并选择 Add -> New Build Phase -> New Run Script Build Phase
    3. 复制下面的构建脚本
    4. 将构建阶段从“运行脚本”重命名为“构建 libxslt”,并将其排在列表的首位
    5. 构建您的项目,这将导致在libxslt/dist 中配置和构建并安装libxslt
    6. 右键单击框架并选择添加 -> 现有文件...,然后选择libxslt/dist/lib/libzslt.a
    7. 转到项目 -> 编辑项目设置 -> 构建
    8. 在搜索路径下,编辑标题搜索路径并添加libxslt/dist/include
    9. 通常根据需要将#include <libxslt/whatever.h> 添加到您的代码中
    10. 在代码中的任何地方都使用zsltFoo 而不是xsltFoo

    这是第 3 步中引用的 libxslt 构建脚本:

    #!/bin/sh
    
    # Setup
    LIBXSLT_VERSION="1.1.26"
    LIBXSLT_SHA1_CHECKSUM="69f74df8228b504a87e2b257c2d5238281c65154"
    GCC_VERSION="4.2.1"
    ARCH="arm-apple-darwin10"
    
    # Bail on any error
    set -e
    
    # Function that patches a file using sed(1).
    # First argument is filename, subsequent arguments are passed to sed(1).
    sed_patch_file()
    {
        FILE="${1}"
        shift
        sed ${1+"$@"} < "${FILE}" > "${FILE}".new
        if ! diff -q "${FILE}" "${FILE}".new >/dev/null; then
            cat "${FILE}".new > "${FILE}"
        fi
        rm "${FILE}".new
    }
    
    # Function that displays the command and then executes it
    show_cmd()
    {
        echo ${1+"$@"}
        ${1+"$@"}
    }
    
    # Dump environment variables
    #echo '***************************************************'
    #env | sort
    #echo '***************************************************'
    
    # Files
    SRCBALL="${SOURCE_ROOT}/libxslt/libxslt-${LIBXSLT_VERSION}.tar.gz"
    SRCDIR="${SOURCE_ROOT}/libxslt/libxslt-${LIBXSLT_VERSION}"
    DISTDIR="${SOURCE_ROOT}/libxslt/dist"
    
    # Verify source is installed
    if ! [ -f "${SRCBALL}" ]; then
        echo "ERROR: please download and install ${SRCBALL}" 2>&1
        echo "The SHA1 checksum should be: ${LIBXSLT_SHA1_CHECKSUM}" 2>&1
        exit 1
    fi
    
    # Unpack the archive if necessary
    if ! [ -e "${SRCDIR}" ]; then
    
        # Unpack archive
        echo "*** Unpacking archive ${SRCBALL}"
        tar zxf "${SRCBALL}" -C libxslt
    
        # Rename all symbols xsltFoobar -> zsltFoobar to avoid broken app store link analyzer
        echo "*** Changing symbol names"
        find libxslt/libxslt-"${LIBXSLT_VERSION}" -name '*.[ch]' -print | while read FILE; do
            sed_patch_file "${FILE}" -E 's%([^[:alnum:]_/"]|^)xslt([A-Z])%\1zslt\2%g'
        done
    
        # Disable build of xsltproc which fails to link
        sed_patch_file libxslt/libxslt-"${LIBXSLT_VERSION}"/Makefile.in -E '/^[[:space:]]xsltproc \\$/d'
    fi
    
    # Build and install
    if ! [ -e "${DISTDIR}" ]; then
    
        # Set up autoconf environment variables
        export CPP="${PLATFORM_DEVELOPER_BIN_DIR}/${ARCH}-gcc-${GCC_VERSION} -E"
        export  CC="${PLATFORM_DEVELOPER_BIN_DIR}/${ARCH}-gcc-${GCC_VERSION}"
        export CXX="${PLATFORM_DEVELOPER_BIN_DIR}/${ARCH}-g++-${GCC_VERSION}"
        export CPPFLAGS="-I${SDKROOT}/usr/lib/gcc/${ARCH}/${GCC_VERSION}/include -I${SDKROOT}/usr/include"
        export LDFLAGS="--sysroot=${SDKROOT}"
        export CFLAGS="-Os -pipe ${CPPFLAGS} ${LDFLAGS}"
        export CXXFLAGS="${CFLAGS}"
        export ARCH
    
        # Configure libxslt
        echo "*** Configuring libxslt-${LIBXSLT_VERSION}"
        ( cd "${SRCDIR}" && show_cmd ./configure \
          --prefix="${DISTDIR}" \
          --build=i386-apple-darwin10 \
          --host="${ARCH}" \
          --enable-static \
          --disable-shared \
          --with-libxml-include-prefix="${SDKROOT}"/usr/include \
          --with-libxml-libs-prefix="${SDKROOT}"/usr/lib \
          --without-python )
    
        # Build it
        echo "*** Building libxslt-${LIBXSLT_VERSION}"
        ( cd "${SRCDIR}" && show_cmd make )
    
        # Install it
        echo "*** Installing libxslt-${LIBXSLT_VERSION}"
        ( cd "${SRCDIR}" && show_cmd make install )
    
        # Change library name to avoid dynamic linking to the iPhone's shared libxslt library
        ln libxslt/dist/lib/lib{x,z}slt.a
    fi
    

    【讨论】:

      【解决方案3】:

      嗨,Hilton,您能否告诉我们您是如何设法将 LIBXSLT 库静态链接到您的应用程序的?

      我和很多其他人有完全相同的问题,但至少目前,我不知道如何将动态库变成静态库。

      谢谢。

      编辑:看看这个Version of XSLT in iPhone

      我的应用程序因使用 LibXSLT 而被拒绝,因此我手动添加了源代码并这样做了。我的应用在几天前获得了批准。

      【讨论】:

      • 我已经离开我的代码一周了,不记得了。我会尽快发布。
      • 是的,我就是这样做的。链接到 libxml2.2.7.3.dylib 并包含 libxslt 的源代码。
      【解决方案4】:

      您只能动态链接到设备上已经存在的库。

      如果要链接到设备上不存在的外部库,则必须自己将其编译为静态库并改为链接。

      【讨论】:

      • 是的。那么,如何将 libxslt 编译为静态库,或者如何将其编译到我的应用程序中?如果我运行 ./configure,是否会将其配置为在我的 Mac iOS 上进行编译?
      【解决方案5】:

      根据 Archie 的回答,这个脚本(使用 XCode 5 命令行工具)生成了一个适合包含在项目中的多架构 libzslt,与 iOS 6 和 iOS 7 项目兼容(尽管我没有包含 iOS 7 64 位)。

      此解决方案假定 libxslt-1.1.28 已解压缩并与脚本位于同一目录中。

      该脚本创建一个目录依赖项,其中包含头文件和 lib 文件。您可以通过调整标头和链接器搜索路径将它们包含在 Xcode 项目中。

      
      
          #!/bin/sh
          # build.sh
      
          GLOBAL_OUTDIR="`pwd`/dependencies"
          LOCAL_OUTDIR="outdir"
          XSLT_LIB="`pwd`/libxslt-1.1.28"
      
          IOS_BASE_SDK="7.0"
          IOS_DEPLOY_TGT="6.0"
      
          sed_patch_file()
          {
              FILE="${1}"
              shift
              sed ${1+"$@"}  "${FILE}".new
              if ! diff -q "${FILE}" "${FILE}".new >/dev/null; then
                  cat "${FILE}".new > "${FILE}"
              fi
              rm "${FILE}".new
          }
      
          patch_libxslt() {
              export LIBXSLT_VERSION=1.1.28
              echo "*** Changing symbol names"
              find libxslt-"${LIBXSLT_VERSION}" -name '*.[ch]' -print | while read FILE; do
                      sed_patch_file "${FILE}" -E 's%([^[:alnum:]_/"]|^)xslt([A-Z])%\1zslt\2%g'
              done
      
                  # Disable build of xsltproc which fails to link
              sed_patch_file libxslt-"${LIBXSLT_VERSION}"/Makefile.in -E '/^[[:space:]]xsltproc \\$/d'
          }
      
          setenv_all()
          {
              unset LIBRARIES
              export LIBRARIES=${SDKROOT}/usr/lib
              echo "*** LIBRARIES: ${LIBRARIES}"
      
              # Add internal libs
              export LDFLAGS="--sysroot=${SDKROOT} $LDFLAGS -L${LIBRARIES}"
              export CFLAGS="--sysroot=${SDKROOT} $CFLAGS -I${SDKROOT}/usr/lib/gcc/${ARCH}/${GCC_VERSION}/include -I${SDKROOT}/usr/include -arch ${ARCH} -Os -pipe ${CPPFLAGS}"
      
              export CXX="$PLATFORM_BIN_DIR/g++"
              export CC="$PLATFORM_BIN_DIR/gcc"
      
              export LD=$TOOLROOT/ld
              export AR=$TOOLROOT/ar
              export AS=$TOOLROOT/as
              export NM=$TOOLROOT/nm
              export RANLIB=$TOOLROOT/ranlib
              export CPPFLAGS=$CFLAGS
              export CXXFLAGS=$CFLAGS
      
              export CXXFLAGS="${CFLAGS}"
          }
      
          setenv_arm7()
          {
              unset LN DEVROOT SDKROOT CFLAGS CC LD CPP CXX AR AS NM CXXCPP RANLIB LDFLAGS CPPFLAGS CXXFLAGS DYLD_LIBRARY_PATH ARCH PLATFORM_BIN_DIR TOOLROOT DISTDIR
      
              export ARCH=armv7
              export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
              export SDKROOT=$DEVROOT/SDKs/iPhoneOS$IOS_BASE_SDK.sdk
              export PLATFORM_BIN_DIR=/Applications/Xcode.app/Contents/Developer/usr/bin
              export TOOLROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin    
      
              export DYLD_LIBRARY_PATH="$SDKROOT/usr/lib"
      
              export CFLAGS="-arch armv7 -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT -I$SDKROOT/usr/include/"
      
              setenv_all
          }
      
          setenv_arm7s()
          {
              unset LN DEVROOT SDKROOT CFLAGS CC LD CPP CXX AR AS NM CXXCPP RANLIB LDFLAGS CPPFLAGS CXXFLAGS DYLD_LIBRARY_PATH ARCH PLATFORM_BIN_DIR TOOLROOT DISTDIR
      
              export ARCH=armv7s
              export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
              export SDKROOT=$DEVROOT/SDKs/iPhoneOS$IOS_BASE_SDK.sdk
              export PLATFORM_BIN_DIR=/Applications/Xcode.app/Contents/Developer/usr/bin
              export TOOLROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin    
      
              export DYLD_LIBRARY_PATH="$SDKROOT/usr/lib"
      
              export CFLAGS="-arch armv7s -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT -I$SDKROOT/usr/include/"
      
              setenv_all
          }
      
          setenv_i386()
          {
              unset LN DEVROOT SDKROOT CFLAGS CC LD CPP CXX AR AS NM CXXCPP RANLIB LDFLAGS CPPFLAGS CXXFLAGS DYLD_LIBRARY_PATH ARCH PLATFORM_BIN_DIR TOOLROOT DISTDIR
      
              export ARCH=i386
              export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
              export SDKROOT=$DEVROOT/SDKs/iPhoneSimulator$IOS_BASE_SDK.sdk
              export PLATFORM_BIN_DIR=$DEVROOT/usr/bin
              export TOOLROOT=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
      
              export CFLAGS="-arch i386 -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT"
      
              setenv_all
          }
      
          create_outdir_lipo()
          {
              for lib_i386 in `find $LOCAL_OUTDIR/i386 -name "lib*\.a"`; do
                  lib_arm7=`echo $lib_i386 | sed "s/i386/arm7/g"`
                  lib_arm7s=`echo $lib_i386 | sed "s/i386/arm7s/g"`
                  lib=`echo $lib_i386 | sed "s/i386\///g"`
                  mkdir -p $(dirname $lib)
                  cmd="xcrun -sdk iphoneos lipo -arch armv7 $lib_arm7 -arch i386 $lib_i386 -arch armv7s $lib_arm7s -create -output $lib"
                  echo $cmd
                  $cmd
              done
          }
      
          merge_libfiles()
          {
              DIR=$1
              LIBNAME=$2
      
              cd $DIR
              for i in `find . -name "lib*.a"`; do
                  $AR -x $i
              done
              $AR -r $LIBNAME *.o
              rm -rf *.o __*
              cd -
          }
      
          #######################
          # libxslt
          #######################
      
          patch_libxslt
      
          cd $XSLT_LIB
          rm -rf $LOCAL_OUTDIR
          mkdir -p $LOCAL_OUTDIR/arm7 $LOCAL_OUTDIR/i386
      
          make clean 2> /dev/null
          setenv_i386
      
          export DISTDIR=`pwd`/$LOCAL_OUTDIR/i386
      
          ./configure --prefix="${DISTDIR}" \
          --enable-static \
          --disable-shared \
          --with-libxml-include-prefix="${SDKROOT}"/usr/include \
          --with-libxml-libs-prefix="${SDKROOT}"/usr/lib \
          --without-crypto \
          --without-python || exit
          make "CC=$CC" "CFLAGS=$CFLAGS" "AR=$AR"
          make install
      
          ln $LOCAL_OUTDIR/i386/lib/lib{x,z}slt.a 
      
          # find ./ -iname *.a | grep -v $LOCAL_OUTDIR | xargs -L 1 -I '{}' cp '{}' $LOCAL_OUTDIR/i386
          # cp -vf lib*.a $LOCAL_OUTDIR/i386
      
          make clean 2> /dev/null
          setenv_arm7
      
          export DISTDIR=`pwd`/$LOCAL_OUTDIR/arm7
      
          ./configure --prefix="${DISTDIR}" \
          --host=armv7-apple-darwin12.5.0 \
          --enable-static \
          --disable-shared \
          --with-libxml-include-prefix="${SDKROOT}"/usr/include \
          --with-libxml-libs-prefix="${SDKROOT}"/usr/lib \
          --without-crypto \
          --without-python || exit
          make -j4
          make install
      
          ln $LOCAL_OUTDIR/arm7/lib/lib{x,z}slt.a 
      
          # find ./ -iname *.a | grep -v $LOCAL_OUTDIR | xargs -L 1 -I '{}' cp '{}' $LOCAL_OUTDIR/arm7
          # cp -rvf lib*.a $LOCAL_OUTDIR/arm7
      
          make clean 2> /dev/null
          setenv_arm7s
      
          export DISTDIR=`pwd`/$LOCAL_OUTDIR/arm7s
      
          ./configure --prefix="${DISTDIR}" \
          --host=armv7s-apple-darwin12.5.0 \
          --enable-static \
          --disable-shared \
          --with-libxml-include-prefix="${SDKROOT}"/usr/include \
          --with-libxml-libs-prefix="${SDKROOT}"/usr/lib \
          --without-crypto \
          --without-python || exit
          make -j4
          make install
      
          ln $LOCAL_OUTDIR/arm7s/lib/lib{x,z}slt.a 
      
          # find ./ -iname *.a | grep -v $LOCAL_OUTDIR | xargs -L 1 -I '{}' cp '{}' $LOCAL_OUTDIR/arm7s
          # cp -rvf lib*.a $LOCAL_OUTDIR/arm7s
      
          create_outdir_lipo
          mkdir -p $GLOBAL_OUTDIR/lib && cp -rvf $LOCAL_OUTDIR/lib/lib*.a $GLOBAL_OUTDIR/lib
          mkdir -p $GLOBAL_OUTDIR/include && cp -rvf $LOCAL_OUTDIR/arm7/include/* $GLOBAL_OUTDIR/include
      
          cd ..
      
          echo "Finished!"
      
      

      【讨论】:

        猜你喜欢
        • 2010-10-08
        • 2011-02-13
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多