1

Swiften は XMPP クライアント ライブラリです。私の目的は、Linux を実行する ARM 組み込みターゲット用にビルドすることでした。

SCons の知識がほとんどない状態で、クロスコンパイルを成功させる方法をハッキングしました。2 つの makery ファイルSConscript.bootSConstruct.

私には2つのタスクがありました(どちらも満足に達成できませんでした):

  1. ツール チェーンをネイティブ コンパイルからクロス コンパイルに正常に切り替える
  2. OpenSSL ライブラリが正常にリンクされていることを確認します ( swiftimプロジェクトでは提供されません3rdParty。フォルダーにインストールしてビルドする必要があります)。

ツール チェーンをネイティブ コンパイルから ARM のクロス コンパイルに切り替える

私の ARM クロス ツール チェーン コンポーネント、gcc、g++、ld などはここにあります。

/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/

sconsネイティブ ツール (通常の場所) の代わりにクロス ツール チェーン (上記の場所から) を使用するように指示する方法が見つかりませんでした/usr/bin。呼び出し ( ./scons Swiften) の前に環境変数の完全修飾値を指定すると、CC と CXX は機能しませんでした (推奨されませんが、1 か所で言及されています)。

Scons は、makery に多くのアドホックな変更を加えた後でも、ネイティブツール チェーンのみを選択します。

そのため、ハックとして、ネイティブ ツール チェーンをクロス ツール チェーンを指すように変更する必要がありました

/usr/bin/gcc -> /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/bin/arm-linux-gnueabihf-gcc-4.7.3*
/usr/bin/g++ -> /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/bin/arm-linux-gnueabihf-g++*

ARM の最初のコンパイル ブレークは、以下の行をビルド スクリプトのデフォルト部分に追加することで修正されましたSConscript.boot

env.Append(CPPDEFINES = ["_LITTLE_ENDIAN"])

次のコンパイル中断は、OpenSSL ヘッダー ファイルが見つからないことに関係しています。場所の問題を修正するには、以下の行を SConscript.boot に導入する必要がありました。

vars.Add(PackageVariable("openssl", "OpenSSL location", "/home/auro-tripathy/swiftim/swift/3rdParty/OpenSSL/openssl-1.0.1c/"))

OpenSSLとの連携

サンプルの Switften プログラムを OpenSSL ライブラリとリンクするには、それらがビルドされた場所からツールチェーン ライブラリの場所に移動libssl.aし(個別にビルド) する必要がありました。libcrypto.a

mv ~/swiftim/swift/3rdParty/OpenSSL/openssl-1.0.1c/libcrypto.a /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/lib/gcc/arm-linux-gnueabihf/4.7.3/.

ヘルプ

scons の動作を理解していないので、動作させるためにいくつかのハックを行いました。

次のことを手伝ってほしい:

  1. 他のターゲットと同様に、ARM-embedded と呼ばれる新しいターゲットを導入します。アイフォン、アンドロイドなど
  2. OpenSSL をビルドに統合するクリーンな方法。

更新 dirkbaechle ごとに、以下のスクリプトを再試行すると動作します

export CC=/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/gcc
export CXX=/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/g++
./scons Swiften
4

3 に答える 3

1

クロスコンパイルに関して上記のコメントを残しました。提供されたリンクで既に回答されていますが、基本的には、適切な構成変数を設定するだけで済みます: CC、CXX、LINK など。

「OpenSSLをビルドに統合するクリーンな方法」については、ライブラリを追加し、引用符で囲まれた値を適切に置き換える次のようにパスを適切に含めるだけで実行できます(元のファイルをコピー/移動する必要はありません)。

# This sets the location of the OpenSSL Include paths
env.Append(CPPPATH="path/to/openssl/includes")

# This sets the location of the OpenSSL Libraries
env.Append(LIBPATH="path/to/openssl/libraries")

# These are the OpenSSL libraries to be linked into the binary
env.Append(LIBS=["OpenSSL_lib", "OpenSSL_lib2"])
于 2014-06-09T08:46:52.030 に答える
1

コンパイラの選択と追加のフラグはすべて、Swift の config.py ファイルで設定できます。カスタム コンパイラとフラグを使用した config.py のスニペットを以下に示します (開発ボックスの 1 つで使用するもの)。

cc = link = "/usr/local/llvm-git/bin/clang"
cxx = "/usr/local/llvm-git/bin/clang++"

bothflags = " -std=c++11 -stdlib=libc++ -nostdinc++"
cxxflags = bothflags + " -I/usr/local/libcxx/include -Wno-deprecated"
linkflags = bothflags + " -L/usr/local/libcxx/lib"

これは、クロスコンパイルでも同じように機能するはずです。

バンドルされた openssl を使用するには、3rdParty/OpenSSL に抽出しopenssl_force_bundled = Trueて、config.py に追加するだけで済みます。これへのインクルード パスを自分で設定する必要はありません。1.0.0a 以降、バンドルされている openssl をコンパイルしていないため、これが特定の openssl リリースに関連付けられていると考えられますが、現在のバージョンで動作しない場合は、おそらく修正する必要があるバグです。自分で openssl をクロスコンパイルして を使用することもできますopenssl='/path/to/openssl'が、それは少し面倒です。

于 2014-08-26T16:39:38.613 に答える