Ошибка связывания libxml2 для библиотеки iOS

Создайте процесс в библиотеке C, вызывая ошибки компоновки, связанные с architecure. Я пытаюсь собрать библиотеку для iOS, но она зависит от libxml2, которая в этом случае, я думаю, является только библиотекой Mac

липо-инфо подтверждает то же самое

admin $ lipo -info /usr/local/lib/libxml2.dylib
Не жирный файл: /usr/local/lib/libxml2.dylib это архитектура: x86_64

ld: warning: игнорировать файл /usr/local/lib/libxml2.dylib, файл был
построен для x86_64, который не является связываемой архитектурой (armv7):
/usr/local/lib/libxml2.dylib Неопределенные символы для архитектуры armv7:
«_xmlAddChild», по ссылке из:
_setIsoId в libspatialite.a (gg_xml.o)
ссылка от:
_vxpath_eval_expr в libspatialite.a (libsplite_la-virtualxpath.o) ld: символ (ы) не найден
для архитектуры armv7 clang: ошибка: сбой команды компоновщика при выходе
код 1 (используйте -v, чтобы увидеть вызов) make [4]: * [demo1] Ошибка 1
сделать [3]:
[install-recursive] Ошибка 1 make [2]: [Установить-полоску] Ошибка 2 сделать1*
[/Users/admin/Downloads/libspatialite-ios-master/build/armv7/lib/libspatialite.a] Ошибка 2 делает: *** [build_arches] Ошибка 2

Изменить # 1

Прокомментировав раздел конфигурации и сборки libspatailite в файле make, я заметил, что остальные зависимости, такие как gets, proj, sqlite, генерируются для всех платформ armv7, armv7s, arm64, i386, x86_64.
Снимок из искателя

Эти данные подтверждают липоинфо в этих библиотеках. Так что проблема заключается только в создании libspatialite.

Makefile (для сборки только libspatialite.a)

XCODE_DEVELOPER = $(shell xcode-select --print-path)
IOS_PLATFORM ?= iPhoneOS

# Pick latest SDK in the directory
IOS_PLATFORM_DEVELOPER = ${XCODE_DEVELOPER}/Platforms/${IOS_PLATFORM}.platform/Developer
IOS_SDK = ${IOS_PLATFORM_DEVELOPER}/SDKs/$(shell ls ${IOS_PLATFORM_DEVELOPER}/SDKs | sort -r | head -n1)

all: lib/libspatialite.a
lib/libspatialite.a: build_arches
mkdir -p lib
mkdir -p include

# Copy includes
cp -R build/armv7/include/geos include
cp -R build/armv7/include/spatialite include
cp -R build/armv7/include/*.h include

# Make fat libraries for all architectures
for file in build/armv7/lib/*.a; \
do name=`basename $$file .a`; \
lipo -create \
-arch armv7 build/armv7/lib/$$name.a \
-arch armv7s build/armv7s/lib/$$name.a \
-arch arm64 build/arm64/lib/$$name.a \
-arch i386 build/i386/lib/$$name.a \
-arch x86_64 build/x86_64/lib/$$name.a \
-output lib/$$name.a \
; \
done;

# Build separate architectures
build_arches:
${MAKE} arch ARCH=armv7 IOS_PLATFORM=iPhoneOS HOST=arm-apple-darwin
${MAKE} arch ARCH=armv7s IOS_PLATFORM=iPhoneOS HOST=arm-apple-darwin
${MAKE} arch ARCH=arm64 IOS_PLATFORM=iPhoneOS HOST=arm-apple-darwin
${MAKE} arch ARCH=i386 IOS_PLATFORM=iPhoneSimulator HOST=i386-apple-darwin
${MAKE} arch ARCH=x86_64 IOS_PLATFORM=iPhoneSimulator HOST=x86_64-apple-darwin

PREFIX = ${CURDIR}/build/${ARCH}
LIBDIR = ${PREFIX}/lib
BINDIR = ${PREFIX}/bin
INCLUDEDIR = ${PREFIX}/include

CXX = ${XCODE_DEVELOPER}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
CC = ${XCODE_DEVELOPER}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
CFLAGS = -isysroot ${IOS_SDK} -I${IOS_SDK}/usr/include -arch ${ARCH} -I${INCLUDEDIR} -miphoneos-version-min=7.0
CXXFLAGS = -stdlib=libc++ -std=c++11 -isysroot ${IOS_SDK} -I${IOS_SDK}/usr/include -arch ${ARCH} -I${INCLUDEDIR} -miphoneos-version-min=7.0
LDFLAGS = -stdlib=libc++ -isysroot ${IOS_SDK} -L${LIBDIR} -L${IOS_SDK}/usr/lib -arch ${ARCH} -miphoneos-version-min=7.0

arch: ${LIBDIR}/libspatialite.a

${LIBDIR}/libspatialite.a: ${LIBDIR}/libproj.a ${LIBDIR}/libgeos.a ${LIBDIR}/libsqlite3.a ${CURDIR}/spatialite
cd spatialite && env \
CXX=${CXX} \
CC=${CC} \
CFLAGS="${CFLAGS} -Wno-error=implicit-function-declaration" \
CXXFLAGS="${CXXFLAGS} -Wno-error=implicit-function-declaration" \
LDFLAGS="${LDFLAGS} -liconv -lgeos -lgeos_c -lc++" ./configure --host=${HOST} --disable-freexl --prefix=${PREFIX} --with-geosconfig=${BINDIR}/geos-config --disable-shared && make clean install-stripclean:
rm -rf build geos proj spatialite sqlite3 include lib

@ gagan-ios, @ kristina-brooks — кажется, что Makefile в каталоге пространственных данных генерируется автоматически сверху Makefile. Я не уверен, как я могу контролировать lib, динамически включать путь к libxml2.

Edit2
Еще один уровень исследований показывает, что создание библиотек для i386 и x86_64 и сбой для armv7, armv7s и arm64

$ {MAKE} arch ARCH = armv7 IOS_PLATFORM = iPhoneOS HOST = arm-apple-darwin
$ {MAKE} arch ARCH = armv7s IOS_PLATFORM = iPhoneOS HOST = arm-apple-darwin
$ {MAKE} arch ARCH = arm64 IOS_PLATFORM = iPhoneOS HOST = arm-apple-darwin
$ {MAKE} arch ARCH = i386 IOS_PLATFORM = Хост iPhoneSimulator = i386-apple-darwin
$ {MAKE} arch ARCH = x86_64 IOS_PLATFORM = Хост iPhoneSimulator = x86_64-apple-darwin

0

Решение

Подходящая заглушка libxml2 должна присутствовать в iPhoneOS SDK, просто добавив -lxml2 чтобы флаги компоновщика работали. Я предполагаю, что вы явно указали абсолютный путь к libxml2.dylib вместо того, чтобы позволить компоновщику использовать относительный путь SDK, вы пытаетесь связать статическую библиотеку ARM с x86_64-версией libxml2 из вашего дистрибутива ОС.

0

Другие решения

Наконец-то удалось найти обходной путь с помощью Makefile на Компиляция внешней библиотеки C ++ для использования с проектом iOS

Обходной путь — это объединение двух разных файлов make и включенных ниже шагов.

1. Частично используйте Makefile для генерации библиотек для всех платформ для зависимостей (профи, geos, sqlite3) https://github.com/gstf/libspatialite-ios

2. Скомпилировал libxml2 из исходного кода, используя Makefile из Компиляция внешней библиотеки C ++ для использования с проектом iOS

3. Сделать файл из Компиляция внешней библиотеки C ++ для использования с проектом iOS используется для создания пространственных библиотек для всех платформ

4. Используйте липо из шага # 1 Makefile для создания библиотеки жира

#!/bin/bash

PLATFORMPATH="/Applications/Xcode.app/Contents/Developer/Platforms"TOOLSPATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin"export IPHONEOS_DEPLOYMENT_TARGET="8.0"pwd=`pwd`

findLatestSDKVersion()
{
sdks=`ls $PLATFORMPATH/$1.platform/Developer/SDKs`
arr=()
for sdk in $sdks
do
arr[${#arr[@]}]=$sdk
done

# Last item will be the current SDK, since it is alpha ordered
count=${#arr[@]}
if [ $count -gt 0 ]; then
sdk=${arr[$count-1]:${#1}}
num=`expr ${#sdk}-4`
SDKVERSION=${sdk:0:$num}
else
SDKVERSION="8.0"fi
}

buildit()
{
target=$1
hosttarget=$1
platform=$2

if [[ $hosttarget == "x86_64" ]]; then
hostarget="i386"elif [[ $hosttarget == "arm64" ]]; then
hosttarget="arm"fi

export CC="$(xcrun -sdk iphoneos -find clang)"export CPP="$CC -E"export CFLAGS="-arch ${target} -isysroot $PLATFORMPATH/$platform.platform/Developer/SDKs/$platform$SDKVERSION.sdk -miphoneos-version-min=$SDKVERSION"export AR=$(xcrun -sdk iphoneos -find ar)
export RANLIB=$(xcrun -sdk iphoneos -find ranlib)
export CPPFLAGS="-arch ${target}  -isysroot $PLATFORMPATH/$platform.platform/Developer/SDKs/$platform$SDKVERSION.sdk -miphoneos-version-min=$SDKVERSION"export LDFLAGS="-arch ${target} -isysroot $PLATFORMPATH/$platform.platform/Developer/SDKs/$platform$SDKVERSION.sdk"
mkdir -p $pwd/output/$target

./configure --prefix="$pwd/output/$target" --disable-shared --disable-sqlite --host=$hosttarget-apple-darwin

make clean
make
make install
}

findLatestSDKVersion iPhoneOS

buildit armv7 iPhoneOS
buildit armv7s iPhoneOS
buildit arm64 iPhoneOS
buildit i386 iPhoneSimulator
buildit x86_64 iPhoneSimulator

Добавьте эти библиотеки в новый проект Xcode и начните использовать его.
Ну вот мой первый успех с использованием этой библиотеки

Включить эти библиотеки

#include <sqlite3.h>
#include <spatialite/gaiageo.h>
#include <spatialite.h>

Используйте приведенные ниже API для получения версии Spatialite

spatialite_init(0);
printf("Spatialite version: %s\n", spatialite_version());

Выход

Spatialite version: 4.3.0
0

По вопросам рекламы [email protected]