Как включить libxslt в приложение для iPhone? - PullRequest
0 голосов
/ 04 сентября 2010

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

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

Как правильно включить библиотеку кода, подобную этой, в мое приложение?

Ответы [ 5 ]

3 голосов
/ 08 июня 2011

Наконец-то я получил libxslt, чтобы встроить Xcode, создать ссылку на мое приложение и уклониться от магазина отклонения магазина приложений.

По сути, вам нужно статически собрать 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. Переименуйте этап сборки из «Run Script» в «Build libxslt» и сделайте его первым в списке
  5. Создайте свой проект, в результате чего libxslt будет настроен, собран и установлен в libxslt/dist
  6. Щелкните правой кнопкой мыши Frameworks и выберите Добавить -> Существующие файлы ..., а затем выберите libxslt/dist/lib/libzslt.a
  7. Перейдите в Проект -> Изменить настройки проекта -> Построить
  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+"$@"} < "${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
2 голосов
/ 13 октября 2010

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


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

Ссылки на частные символы xsltApplyStylesheet xsltCleanupGlobals xsltFreeStylesheet xsltInit xsltParseStylesheetFile xsltSaveResultToString

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


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

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

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

2 голосов
/ 27 октября 2010

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

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

Спасибо.

РЕДАКТИРОВАТЬ: Проверьте эту версию XSLT в iPhone

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

1 голос
/ 04 сентября 2010

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

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

0 голосов
/ 28 сентября 2013

Исходя из ответа Арчи, этот сценарий (с инструментами командной строки XCode 5) генерирует мульти-архитектурную библиотеку libzslt, подходящую для включения в проект, совместимую с проектами iOS 6 и iOS 7 (хотя я не включил 64-разрядную версию iOS 7) ).

Это решение предполагает, что 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!"

...