在C库上创建进程导致与architecure相关的链接错误 . 我正在尝试为iOS构建库但是它依赖于libxml2,在这种情况下我猜是Mac只有库
lipo -info也证实了这一点
admin $ lipo -info /usr/local/lib/libxml2.dylib非胖文件:/usr/local/lib/libxml2.dylib是体系结构:x86_64
ld:警告:忽略文件/usr/local/lib/libxml2.dylib,文件是为x86_64构建的,它不是被链接的体系结构(armv7):/ usr / local / lib / libxml2.dylib体系结构armv7的未定义符号: “_xmlAddChild”,引自:libspatialite.a中的_setIsoId(gg_xml.o)引用自:libspatialite.a中的_vxpath_eval_expr(libsplite_la-virtualxpath.o)ld:未找到架构armv7 clang的符号:错误:链接器命令失败使用退出代码1(使用-v查看调用)make [4]:* [demo1]错误1 make [3]:[install-recursive]错误1 make [2]:[install-strip]错误2 make1:* [/Users/admin/Downloads/libspatialite-ios-master/build/armv7/lib/libspatialite.a]错误2 make:*** [build_arches]错误2
Edit#1
在评论后,make文件中的libspatailite配置和make部分,我注意到其他依赖项如get,proj,sqlite正在为所有平台armv7,armv7s,arm64,i386,x86_64生成 .
这些图书馆的lipo -info也证实了这一点 . 所以问题仅限于 Build 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-strip
clean:
rm -rf build geos proj spatialite sqlite3 include lib
@gagan-ios,@ kristina-brooks - 似乎在creatite目录中的Makefile是从Makefile上面自动生成的 . 我不知道如何控制lib,包含动态的libxml2路径 .
Edit2 还有一个级别的调查显示,为i386和x86_64生成了库,并且没有为armv7,armv7s和arm64生成
$ arch ARCH = armv7 IOS_PLATFORM = iPhoneOS HOST = arm-apple-darwin $ arch ARCH = armv7s IOS_PLATFORM = iPhoneOS HOST = arm-apple-darwin $ arch ARCH = arm64 IOS_PLATFORM = iPhoneOS HOST = arm-apple-darwin $ arch ARCH = i386 IOS_PLATFORM = iPhoneSimulator HOST = i386-apple-darwin $ arch ARCH = x86_64 IOS_PLATFORM = iPhoneSimulator HOST = x86_64-apple-darwin
2 回答
iPhoneOS SDK中应该包含一个合适的libxml2存根,只需将
-lxml2
添加到链接器标志即可 . 我'm guessing you'已明确指定libxml2.dylib
的绝对路径,而不是让链接器使用SDK相对路径,因此您尝试将ARM静态库与OS分发中的x86_64版本的libxml2链接 .终于能够在Compiling external C++ library for use with iOS project的Makefile帮助下找到解决方法
解决方法是两个不同的make文件的合并,并涉及以下步骤 .
1.部分使用Makefile为所有依赖平台生成库(专业版,地理位置,sqlite3)https://github.com/gstf/libspatialite-ios
2.使用Compiling external C++ library for use with iOS project中的Makefile从源代码编译libxml2
来自Compiling external C++ library for use with iOS project的Makefile用于为所有平台生成空间图书库
4.使用步骤#1 Makefile中的lipo生成脂肪库
将这些库添加到新的Xcode项目并开始使用它 . 那么这是我第一次成功使用这个库
包括这些库
使用以下API获取Spatialite版本
产量