2017-05-09 42 views
0

在C库上产生的过程导致与architecure有关的链接错误。我试图为iOS构建库,但它已取决于libxml2,在这种情况下,我猜是Mac只有库libxml2链接错误的iOS库

脂-info证实了相同的

ADMIN $脂-info /usr/local/lib/libxml2.dylib 非FAT文件:/usr/local/lib/libxml2.dylib是架构:x86_64的

ld: warning: ignoring file /usr/local/lib/libxml2.dylib, file was built for x86_64 which is not the architecture being linked (armv7): /usr/local/lib/libxml2.dylib Undefined symbols for architecture armv7: "_xmlAddChild", referenced from: _setIsoId in libspatialite.a(gg_xml.o) referenced from: _vxpath_eval_expr in libspatialite.a(libsplite_la-virtualxpath.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[4]: * [demo1] Error 1 make[3]: [install-recursive] Error 1 make[2]: [install-strip] Error 2 make 1 : * [/Users/admin/Downloads/libspatialite-ios-master/build/armv7/lib/libspatialite.a] Error 2 make: *** [build_arches] Error 2

编辑#1

经过评论,libspatailite配置和make部分在make文件中,我注意到其他依赖关系如gets,proj,sqlite正在为所有平台armv7,armv7s,arm64,i386,x86_64生成。 Snapshot from finder

lipo -info对这些库的确认是一致的。所以问题仅限于构建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,@克里斯蒂娜 - 布鲁克斯 - 这似乎Makefile文件spatialite目录内得到自动从上面Makefile.I产生我不知道我是怎么可以控制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 HOST=i386-apple-darwin ${MAKE} arch ARCH=x86_64 IOS_PLATFORM=iPhoneSimulator HOST=x86_64-apple-darwin

+0

整合检查并按照SDK文档中的建议添加其他链接标志。 –

回答

0

一个合适的libxml2短线应该出现在的iPhoneOS SDK如何产生库,只是将-lxml2添加到链接器标志应该工作。我猜你已经明确指定了一个绝对路径来代替libxml2.dylib,而不是让链接器使用SDK相对路径,所以你试图从操作系统发行版中将ARM静态库与libxml2的x86_64版本链接起来。

+0

我想从这里建立https://github.com/gstf/libspatialite-ios,有了你的建议,我注意到Makefile包含以下条目LIBXML2_LIBS = -L/usr/local/lib -lxml2 .....也许我必须编辑这个指向另一个位置.. – addcolor

+0

没有运气编辑Makefile导致相同的错误 – addcolor

0

最后能够在Compiling external C++ library for use with iOS project

工作四处打听与Makefile文件的帮助下,解决办法是2个不同的make文件的合并,涉及下面的步骤。

1.使用生成文件部分地从Compiling external C++ library for use with iOS project

3.Makefile从Compiling external C++ library for use with iOS project生成从使用生成文件源对于所有平台库依赖(利弊,GEOS,sqlite3的)https://github.com/gstf/libspatialite-ios

2.Compiled libxml2的用于产生文库spatialite对于所有平台

从步骤#1生成文件

4.使用脂,以产生脂肪库

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