7

https://www.gnupg.org/download/index.htmlから最新の libgcrypt & libgpg-error ライブラリをダウンロードしました。./configure --enable-static --disable-shared; を使用して両方のライブラリを (コマンド ラインで) 正常にビルドしました。作る ; 私のMacにインストールします(OSX 10.10および最新のXcode 6.1を搭載したMavericks)。

私が構築している OS X クライアント アプリから、これらの新しいライブラリに問題なくリンクできます。ここまでは順調ですね。完璧。しかし、まったく同じソース コードを使用して iOS クライアントを構築する必要もあります。

質問:

1) (シミュレーター、Mac & iOS) 用のユニバーサル スタティック ライブラリをビルドするために必要な、ライブラリのコマンド ライン ビルド シーケンスへの変更は何ですか? 2) または、iOS 用に別の静的ライブラリを作成する必要がありますか? もしそうなら、もう一度、ターゲット アーキテクチャを正しくするために、どのようなコマンド ライン マジックが必要でしょうか?

4

2 に答える 2

2

ジェレミーは良い答えを出しましたが、私はいくつかのことを追加して、私の 2 セントを差し上げたいと思います。

更新されたスクリプト

#!/bin/bash

OPT_FLAGS="-O3 -g3"
MAKE_JOBS=8

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

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

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

SDK="iphoneos"
ARCH_FLAGS="-arch armv7 -arch armv7s -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_ARM"
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"
dobuild

iOS ツールチェーンは SDK によって分離されており、iphonesimulator には macos、tvos、そしてもちろん iphoneos と同様に個別の SDK があります。SDK ごとに 1 つのコンパイルが必要です。iphonesimulator と iphoneos の出力には異なるアーキテクチャが含まれているため、1 つのライブラリにまとめることができますが、実際には同じ SDK でコンパイルされていません。混合 SDK のスーパー バイナリには反対することをお勧めします。

なぜ私はこれをしているのですか?

ライブラリをコンパイルしていてこれが必要な場合は、ライブラリが autoconf を使用しているか、Boost および OpenSSL の他のカスタム ビルド システムを使用していることが原因です。SDK 用にコンパイルするための鍵は、正しいclang-sysroot-miphoneos-ver-min、および-archフラグです。-archまたは-sysrootフラグを間違えると、#error Unsupported architectureエラーが表示されます。

--disable-sharedフラグを削除します

静的ライブラリを使用するつもりでも、共有ライブラリの生成を残すのが好きです。これは通常、Position Independent Code (-fPIC) でコンパイルすることを意味するため、このライブラリを共有ライブラリに含めることにした場合は、問題ありません。また、リンクされていないがアーカイブされている静的ライブラリとは異なり、共有ライブラリをリンクすると、不足しているオブジェクトが公開されることがよくあります。

ライン上の複数のアーキテクチャ

行に複数のフラグを渡すことができ-arch、FAT バイナリを取得できます。これにより、コンパイル中の手間と時間を節約できます。

$ lipo -info libwhatever.a 
Architectures in the fat file: libwhatver.a are: i386 x86_64 

アーキテクチャを削除

i386正直なところ、サポートが必要ですか? そのデバイスを対象としていない場合は、アーキテクチャを含めないでください。ホストシステムが Lion より前の OS を実行している場合にのみ、i386 が必要です。

于 2018-04-29T06:43:01.797 に答える