如何在iPhone应用程序中包含libxslt?

如何在iPhone应用程序中包含libxslt?,iphone,xcode,libxml2,libxslt,Iphone,Xcode,Libxml2,Libxslt,我听说包括libxslt.dylib是你的应用被拒绝的理由。我不知道这有多准确 尽管如此,我还是希望包括libxslt的最新版本。我希望对libxml2以及将来的其他库做同样的事情 在我的应用程序中包含这样的代码库的正确方法是什么?您只能动态链接到设备上已经存在的库 如果你想链接到设备上不存在的外部库,你必须自己将其编译到一个静态库,然后链接到该库。我的应用被拒绝,苹果发出以下消息 无法将XYZ应用发布到应用商店,因为它正在使用私有或未记录的API: 专用符号引用 xsltApplyStyle

我听说包括libxslt.dylib是你的应用被拒绝的理由。我不知道这有多准确

尽管如此,我还是希望包括libxslt的最新版本。我希望对libxml2以及将来的其他库做同样的事情


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

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


如果你想链接到设备上不存在的外部库,你必须自己将其编译到一个静态库,然后链接到该库。

我的应用被拒绝,苹果发出以下消息


无法将XYZ应用发布到应用商店,因为它正在使用私有或未记录的API:

专用符号引用 xsltApplyStylesheet xsltCleanupGlobals xsltFreeStylesheet xsltInit xsltParseStylesheetFile xsltsaveresultostring

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


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

除了不使用xml和xslt之外,我找不到任何明确的方法来解决这个问题。那完全没有道理


希尔顿,你成功地向iTunes提交了一个使用xslt的应用程序了吗?

嘿,希尔顿,你能告诉我们你是如何将LIBXSLT库静态链接到你的应用程序的吗

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

谢谢

编辑:查看这个


我的应用程序因为使用LibXSLT而被拒绝,因此我手动添加了源代码,并以这种方式完成了添加。我的应用程序几天前获得批准。

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

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

下面是一个如何通过10个简单的步骤来完成的示例:)

  • 创建一个子目录
    libxslt
    ,并将
    libxslt-1.1.26.tar.gz
    放入其中
  • 右键单击Target->YourApp并选择Add->New Build Phase->New Run Script Build Phase
  • 复制下面的构建脚本
  • 将构建阶段的名称从“运行脚本”重命名为“构建libxslt”,并将其放在列表的第一位
  • 构建您的项目,这将导致在
    libxslt/dist
  • 右键单击框架并选择添加->现有文件。。。然后选择
    libxslt/dist/lib/libzslt.a
  • 转到项目->编辑项目设置->生成
  • 在搜索路径下,编辑标题搜索路径并添加
    libxslt/dist/include
  • 根据需要向代码中添加
    #包括
  • 在代码中的任何地方使用
    zsltFoo
    而不是
    xsltFoo
  • 下面是第3步中引用的
    libxslt
    build脚本:

    #/垃圾箱/垃圾箱
    #设置
    LIBXSLT_VERSION=“1.1.26”
    LIBXSLT_SHA1_CHECKSUM=“69f74df8228b504a87e2b257c2d5238281c65154”
    GCC_VERSION=“4.2.1”
    ARCH=“arm-apple-darwin10”
    #对任何错误保释
    set-e
    #使用sed(1)修补文件的函数。
    #第一个参数是filename,随后的参数传递给sed(1)。
    sed_补丁_文件()
    {
    FILE=“${1}”
    转移
    sed${1+“$@”}<“${FILE}”>“${FILE}”。新建
    如果!diff-q“${FILE}”“${FILE}”.new>/dev/null;那么
    cat“${FILE}”.new>“${FILE}”
    fi
    rm“${FILE}”。新建
    }
    #函数,该函数显示命令,然后执行命令
    show_cmd()
    {
    回显${1+“$@”}
    ${1+"$@"}
    }
    #转储环境变量
    #回声“***************************************************************************************”
    #环境分类
    #回声“***************************************************************************************”
    #档案
    SRCBALL=“${SOURCE_ROOT}/libxslt/libxslt-${libxslt_VERSION}.tar.gz”
    SRCDIR=“${SOURCE\u ROOT}/libxslt/libxslt-${libxslt\u VERSION}”
    DISTDIR=“${SOURCE\u ROOT}/libxslt/dist”
    #验证源是否已安装
    如果![-f“${SRCBALL}”];然后
    echo“错误:请下载并安装${SRCBALL}”2>&1
    echo“SHA1校验和应为:${LIBXSLT_SHA1_校验和}”2>&1
    出口1
    fi
    #如有必要,打开归档文件
    如果![-e“${SRCDIR}”];然后
    #解包归档
    echo“***解包存档${SRCBALL}”
    tar zxf“${SRCBALL}”-C libxslt
    #重命名所有符号xsltFoobar->zsltFoobar以避免断开应用商店链接分析器
    回显“***更改符号名称”
    在读取文件时查找libxslt/libxslt-“${libxslt_VERSION}”-name'*.[ch]'-print |;做
    sed_patch_file“${file}”-E's%([^[:alnum:][unum:][u/”]|^)xslt([A-Z])%\1zslt\2%g'
    完成
    #禁用无法链接的xsltproc的生成
    sed_patch_file libxslt/libxslt-“${libxslt_VERSION}”/Makefile.in-E'/^[:space:]xsltproc\\\$/d”
    fi
    #构建和安装
    如果![-e“${DISTDIR}”];则
    #设置autoconf环境变量
    export CPP=“${PLATFORM\u DEVELOPER\u BIN\u DIR}/${ARCH}-gcc-${gcc\u VERSION}-E”
    export CC=“${PLATFORM\u DEVELOPER\u BIN\u DIR}/${ARCH}-gcc-${gcc\u VERSION}”
    export CXX=“${PLATFORM\u DEVELOPER\u BIN\u DIR}/${ARCH}-g++-${GCC\u VERSION}”
    export CPPFLAGS=“-I${SDKROOT}/usr/lib/gcc/${ARCH}/${gcc_VERSION}”
    
    #!/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
    
    
    
        #!/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!"