2014-11-07 10 views
5

https://www.gnupg.org/download/index.html에서 최신 libgcrypt & libgpg 오류 라이브러리를 다운로드했습니다. ./configure --enable-static --disable-shared;를 사용하여 두 라이브러리를 성공적으로 빌드했습니다 (명령 줄). 만들다; 내 Mac (Mavericks w/OSX 10.10 & 최신 Xcode 6.1)에 설치하십시오.iOS에서 사용할 libgcrypt 정적 라이브러리

내가 만들고있는 OS X 클라이언트 앱에서이 새로운 라이브러리에 잘 링크 할 수 있습니다. 여태까지는 그런대로 잘됐다. 완벽 해. 하지만 똑같은 소스 코드를 사용하여 iOS 클라이언트를 만들어야합니다.

질문 :

나는 (시뮬레이터에 대한 보편적 인 정적 라이브러리, 맥 & 아이폰 OS)를 구축 할 필요가 라이브러리에 대한 명령 줄 빌드 순서에 대한 수정은 무엇

1)? 2) 아니면 iOS 용 별도의 정적 라이브러리를 만들어야합니까? 그렇다면 목표 아키텍처를 올바르게 구현하려면 커맨드 라인 마법이 필요합니까?

답변

12

iOS 시뮬레이터와 macOS에서 모두 작동하는 범용 라이브러리를 빌드 할 수는 없습니다. iOS/Intel 및 macOS/Intel은 C 런타임 라이브러리 (Libc)보다 ABI 호환되지 않습니다. 이 답변은 iOS 타겟을 위해 autoconf 기반 프로젝트를 크로스 컴파일하는 방법을 보여 주며 결과로 생성되는 정적 아카이브를 함께 쉽게 작성할 수 있습니다.

이 같은 일을 할 것입니다 :

#!/bin/bash -e -x 

OPT_FLAGS="-Os -g3" 
MAKE_JOBS=16 

dobuild() { 
    export CC="$(xcrun -find -sdk ${SDK} cc)" 
    export CXX="$(xcrun -find -sdk ${SDK} cxx)" 
    export CPP="$(xcrun -find -sdk ${SDK} cpp)" 
    export CFLAGS="${HOST_FLAGS} ${OPT_FLAGS}" 
    export CXXFLAGS="${HOST_FLAGS} ${OPT_FLAGS}" 
    export LDFLAGS="${HOST_FLAGS}" 

    ./configure --host=${CHOST} --prefix=${PREFIX} --enable-static --disable-shared 

    make clean 
    make -j${MAKE_JOBS} 
    make install 
} 

SDK="iphoneos" 
ARCH_FLAGS="-arch armv7" 
HOST_FLAGS="${ARCH_FLAGS} -miphoneos-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" 
CHOST="arm-apple-darwin" 
PREFIX="${HOME}/DEVICE_ARM" 
dobuild 

SDK="iphoneos" 
ARCH_FLAGS="-arch arm64" 
HOST_FLAGS="${ARCH_FLAGS} -miphoneos-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" 
CHOST="arm-apple-darwin" 
PREFIX="${HOME}/DEVICE_ARM64" 
dobuild 

SDK="iphonesimulator" 
ARCH_FLAGS="-arch i386" 
HOST_FLAGS="${ARCH_FLAGS} -mios-simulator-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" 
CHOST="i386-apple-darwin" 
PREFIX="${HOME}/SIM_i386" 
dobuild 

SDK="iphonesimulator" 
ARCH_FLAGS="-arch x86_64" 
HOST_FLAGS="${ARCH_FLAGS} -mios-simulator-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" 
CHOST="x86_64-apple-darwin" 
PREFIX="${HOME}/SIM_x86_64" 
dobuild 

난 그냥 함께 해당 스크립트를 던져 버리고는 pixman 위해 (--disable-의 libpng와 건너 뛰는 시험의 추가와 함께) 작동 확인했습니다. libgcrypt 용으로 커스터마이징 할 필요가 있지만, iOS 용 autoconf/automake/glibtool 기반 프로젝트를 빌드하기위한 일반적인 패턴을 보여줍니다.

빌드 후 ~/{DEVICE_ARM {, 64}, SIM_ {i386, x86_64}}의 콘텐츠가 있고 정적 라이브러리를 모두 함께 사용하거나 프로젝트에서 모두 사용할 수 있습니다 (링커 무시할 수있는 "다른"아카이브의 누락 된 조각에 대한 경고를 내 보냅니다).

lipo -create -output lib.a DEVICE_ARM/lib/lib.a DEVICE_ARM64/lib/lib.a SIM_i386/lib/lib.a SIM_x86_64/lib/lib.a 
+0

빌드 구성 유형의 뉘앙스에 대해 완전히 익숙하지 않아도 될 수 있습니다. 나는 config.log가 다중 #error Unsupported architecture를 생성하고 있다는 것을 알았다. –

+0

그래, 나는 대답을 훨씬 더 명백하게 업데이트했다. 나는 대본을 썼고 pixman에서 그것을 테스트했다. 다른 autoconf/automake/glibtool 프로젝트를 위해이 파일을 수정해야하지만 일반적인 생각을 갖게됩니다. –