2010-09-04 72 views
0

我聽說包括libxslt.dylib是讓你的應用程序被拒絕的理由。我不知道那是多麼準確。如何在我的iPhone應用程序中包含libxslt?

不過,我想包含最新版本的libxslt。我想在libxml2以及其他未來的庫中做同樣的事情。

在我的應用中包含這樣的代碼庫的正確方法是什麼?

回答

2

嘿希爾頓,有什麼機會讓我們知道你如何將LIBXSLT庫靜態鏈接到你的應用程序?

我和其他幾個人有完全相同的問題,但至少現在我不知道如何將動態庫轉換爲靜態庫。

謝謝。

編輯:看看這個Version of XSLT in iPhone

我的應用程序被拒絕使用這樣的libxslt代替我手動添加的源代碼,並沒有這樣的說法。我的應用程序在幾天前獲得批准。

+0

我離開我的代碼一週,不記得我的頭頂。我會盡快發佈。 – 2010-10-29 21:04:15

+0

是的,我就是這麼做的。鏈接到libxml2.2.7.3.dylib幷包含libxslt的源代碼。 – 2010-11-29 14:02:26

1

您只能動態鏈接到設備上已存在的庫。

如果您想鏈接到設備上不存在的外部庫,您必須將其自己編譯爲靜態庫並鏈接到該庫。

+0

是的。那麼,如何將libxslt編譯爲靜態庫,或者如何將它編譯到我的應用程序中?如果我運行./configure,是否將它配置爲在我的Mac *和* iOS上進行編譯? – 2010-09-06 14:08:18

+0

請參閱:http://stackoverflow.com/questions/1083631/timidity-need-help-compiling-this-library-for-the-iphone – 2010-09-06 18:10:29

2

我的應用被Apple拒絕了以下消息。


,因爲它使用專用或無證的API

XYZ應用程序無法發佈到App Store:

私人符號引用 xsltApplyStylesheet xsltCleanupGlobals xsltFreeStylesheet xsltInit xsltParseStylesheetFile xsltSaveResultToString

正如你如iPhone開發者計劃許可協議第3.3.1節所述,知道使用非公共API不允許。在您的應用程序可以由App Review Team審覈之前,請解決此問題並將新的二進制文件上傳到iTunes Connect。


這是我的理解是,和的libxslt庫的libxml2實際上是出現在設備上,並通過在Xcode的下拉菜單中提供。我動態鏈接這兩個庫的鏈接,我的應用程序在設備上運行的非常漂亮。因此,庫必須在設備上。爲什麼我需要從頭開始構建這些庫作爲靜態庫,並增加我的應用程序的大小?

我找不到任何明確的方法來解決這個問題,除了不使用xml和xslt。這根本沒有意義!

希爾頓,您是否成功地將應用程序提交給使用xslt的iTu​​nes?

+0

我還沒有提交我的應用程序使用它。儘管我將libxslt庫靜態鏈接到我的應用程序中。希望他們的私有API分析器可以區分這兩種用法。 – 2010-10-13 20:29:08

+0

所以我現在編譯libxslt和libxml到靜態庫中並將它們合併到我的應用程序中。他們的工作非常出色,但應用商店拒絕我的應用程序是出於非常原因。我懷疑他們沒有區分使用他們的私人API和使用我自己的集成庫。有什麼建議麼? – 2011-01-12 21:34:32

3

我最終得到了libxslt來構建Xcode,鏈接到我的應用程序,並逃避應用商店rejectbot。

基本上,您必須靜態構建libxslt並更改符號名稱,以便它們與Apple查找的名稱不匹配。所有符號xsltFoo()必須更改爲zsltFoo()。庫本身的名稱也必須從libxslt.a更改爲libzslt.a

這裏有一個如何做到這一點在10個簡單的步驟:)

  1. 創建一個子目錄libxslt並把libxslt-1.1.26.tar.gz進去。
  2. 右鍵單擊目標 - > YourApp並選擇添加 - >新建構建階段 - >新運行腳本生成階段
  3. 複製下面
  4. 構建腳本從「運行腳本」重命名構建階段,以「打造的libxslt 「並使其在列表的首位
  5. 生成項目,這將導致libxslt進行配置和建造和安裝在libxslt/dist
  6. 右鍵單擊框架,然後選擇添加 - >現有文件...然後選擇libxslt/dist/lib/libzslt.a
  7. 進入項目 - >編輯項目設置 - >構建
  8. 在搜索路徑,編輯標題搜索路徑和添加libxslt/dist/include
  9. 添加#include <libxslt/whatever.h>到您的代碼通常需要
  10. 使用zsltFoo,而不是在你的代碼xsltFoo到處

這裏是

#!/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+"[email protected]"} < "${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+"[email protected]"} 
    ${1+"[email protected]"} 
} 

# 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 
0

基礎上阿奇的答案,這個S:libxslt構建腳本步驟#3引用cript(使用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+"[email protected]"} "${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!" 

相關問題