2010-09-04 2 views
0

Я слышал, что в том числе libxslt.dylib является основанием для отклонения вашего приложения. Я не знаю, насколько это точно.Как включить libxslt в приложение для iPhone?

Тем не менее, я хотел бы включить последнюю версию libxslt. Я хотел бы сделать то же самое с libxml2, а также с другими библиотеками в будущем.

Каков правильный способ включения такой библиотеки кода в мое приложение?

ответ

2

Хей Хилтон, любой шанс, что вы могли бы сообщить нам, как вам удалось статически связать библиотеку LIBXSLT с вашим приложением?

У меня такая же проблема, как и многие другие, но в данный момент, по крайней мере, я понятия не имею, как превратить динамическую библиотеку в статическую.

Спасибо.

EDIT: Проверьте это Version of XSLT in iPhone

Мое приложение было отклонено для использования LibXSLT так вместо этого я вручную добавить исходный код и сделал это таким образом. Мое приложение было одобрено несколько дней назад.

+0

Я вдали от своего кода на неделю и не помню с головы. Я отправлю, как только смогу. –

+0

Да, вот как я это сделал. Связан с libxml2.2.7.3.dylib и включен источник libxslt. –

1

Вы можете динамически связываться с библиотеками, которые уже присутствуют на устройстве.

Если вы хотите установить ссылку на внешнюю библиотеку, которой нет на устройстве, вам придется сначала ее скомпилировать в статическую библиотеку и ссылку.

+0

Да. Итак, как мне скомпилировать libxslt как статическую библиотеку или как ее просто скомпилировать в мое приложение? Если я запустил ./configure, будет ли он настраивать его для компиляции на обоих Mac * и * iOS? –

+0

Смотрите: http://stackoverflow.com/questions/1083631/timidity-need-help-compiling-this-library-for-the-iphone –

2

Мое приложение было отклонено с сообщением от Apple.


XYZ приложение не может быть размещен в App Store, поскольку он использует частные или недокументированные API:

Private Symbol Референции xsltApplyStylesheet xsltCleanupGlobals xsltFreeStylesheet xsltInit xsltParseStylesheetFile xsltSaveResultToString

Как вам знаете, как указано в разделе 3.3.1 Лицензионного соглашения с Программой разработчиков iPhone, использование непубличных API i s не разрешено. Перед тем, как приложение может быть просмотрено командой обзора приложений, решите эту проблему и загрузите новый бинарный файл в iTunes Connect.


Это было мое понимание того, что LibXSLT и libxml2 библиотеки были фактически на устройстве и доступны через выпадающее меню в Xcode. Я динамически свяжу ссылку с этими двумя библиотеками, и мое приложение прекрасно работает на устройстве. Следовательно, библиотеки должны быть на устройстве. Зачем мне создавать эти библиотеки с нуля как статические библиотеки и увеличивать размер моего приложения?

Я не могу найти четкого способа обойти это, кроме использования xml и xslt. Это не имеет никакого смысла!

Хилтон, вам удалось отправить приложение в iTunes, в котором используется xslt?

+0

Я еще не отправил свое приложение, которое его использует. Однако я статически связывал библиотеку libxslt с моим приложением. Надеюсь, их частный API-анализатор может различать два способа использования. –

+0

Итак, теперь я собрал libxslt и libxml в статические библиотеки и включил их в свое приложение. Они работают чудесно, но магазин приложений отклонил мое приложение по самой причине samje. Я подозреваю, что они не различают использование своего частного API и использование собственной встроенной библиотеки. Какие-либо предложения? –

3

Я, наконец, получил libxslt, чтобы построить Xcode, ссылку на мое приложение и уклониться от хранилища отказов приложения.

В принципе, вам необходимо построить libxslt статически и изменить имена символов, чтобы они не соответствовали тем, которые ищет Apple. Все символы xsltFoo() должны быть изменены на zsltFoo(). Также имя самой библиотеки должно быть изменено с libxslt.a на libzslt.a.

Вот как сделать это в 10 простых шагов :)

  1. Создать подкаталог libxslt и положить libxslt-1.1.26.tar.gz в него.
  2. правой кнопкой мыши на Target -> YourApp и выберите Add -> New Phase Build -> New Run Script Построить Phase
  3. Скопируйте сценарий сборки ниже
  4. Переименовать фазу сборки из "Run Script", чтобы «построить LibXSLT "и сделать его первым в списке
  5. Создайте свой проект, который заставит libxslt быть сконфигурированы и изготовлены и установлены в libxslt/dist
  6. правой кнопкой мыши на рамочные и выберите Add -> Существующие файлы ... и затем выберите libxslt/dist/lib/libzslt.a
  7. Перейти к проекту -> Редактировать проект Настройки -> Build
  8. Под Пути поиска, редактирования заголовка Пути поиска и добавления libxslt/dist/include
  9. Добавить #include <libxslt/whatever.h> в код по мере необходимости, как правило
  10. Использование zsltFoo вместо xsltFoo везде в коде

Вот libxslt сценарий сборки ссылаются на шаге 3:

#!/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 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!" 

Смежные вопросы