web-dev-qa-db-ja.com

クロスコンパイル時に外部ライブラリを使用する方法

X86 ubuntuマシンでRaspberry Pi ARMターゲット用のコードを書いています。 gcc-linaro-armhfツールチェーンを使用しています。 piでいくつかの独立したプログラムをクロスコンパイルして実行できます。ここで、コードをncursesなどの外部ライブラリにリンクさせたいと思います。どうすればこれを達成できますか。

ホストマシン上の既存のncurses libとプログラムをリンクしてから、ARMで実行する必要がありますか? (これが機能するとは思わない)armのlibのソースまたはビルド済みバージョンを取得し、libパスに入れてコンパイルする必要がありますか?

このような状況でのベストプラクティスは何ですか?

また、c stdlibでどのように機能するかを知りたいです。私のプログラムでは、stdio関数を使用し、クロスコンパイル後に何も特別なことをせずに機能しました。 makefileで腕のgccのパスを指定しました。だから、私は知りたい、それがどのように正しい標準ヘッダーとライブラリを取得したのですか?

30
Punit Soni

一般的な質問について:

Cライブラリが機能する理由:

Cライブラリは、クロスツールチェーンの一部です。これが、ヘッダーが見つかり、プログラムが正しくリンクして実行される理由です。これは、libmやlibstdc ++などの他の非常に基本的なシステムライブラリにも当てはまります(すべての場合で、ツールチェーンの構成に依存するわけではありません)。

一般に、クロス開発を扱う場合、目的のライブラリをクロスコンパイルするための何らかの方法が必要です。この場合、バイナリを使用することは非常にまれです。つまり、特にARMハードウェアでは、非常に多くの異なる構成があり、多くの場合、すべてが異なる方法で大幅に削除されるためです。 。

Raspberry PiでUbuntuを実行している場合、インターネット上またはUbuntuのaptリポジトリーで適切なncursesライブラリを見つける可能性があります。ただし、一般的な方法は、特定のツールチェーンを使用してライブラリをクロスコンパイルすることです。

多くの複雑なライブラリをクロスコンパイルする必要がある場合、buildrootやptxdistのように作業を少し楽にするソリューションがあります。これらのプログラムは、組み込みデバイス用の完全なLinuxカーネルとルートファイルシステムを構築します。

ただし、ncursesだけが必要な場合は、自分でソースコードをコンパイルできます。ソースをダウンロードするだけで、--Hostオプションを使用してツールチェーンを指定しながらconfigureを実行できます。 --prefixオプションはインストールディレクトリを選択します。 makemake installを実行した後、すべてがうまくいったことを考慮すると、リンクするアプリケーション用の一連のヘッダーとARMコンパイルされたライブラリが得られます。

クロスコンパイルについては、インターネット上で多くの情報を確実に見つけることができます。また、ncursesには出荷されたドキュメントにもいくつかのポインタがあります。

23
gerrit zijlstra

クエリの場合_How the C library works in cross-tools_

構成中にクロスツールチェーンをコンパイルおよびビルドすると、sysrootが提供されます。

_--with-sysroot=${CLFS_CROSS_TOOLS}_など

_--with-sysroot_ _--with-sysroot=dir_

Tells GCC to consider dir as the root of a tree that contains (a subset of) the root filesystem of the target operating system. Target system headers, libraries and run-time object files will be searched for in there. More specifically, this acts as if --sysroot=dir was added to the default options of the built compiler. The specified directory is not copied into the install tree, unlike the options --with-headers and --with-libs that this option obsoletes. The default value, in case --with-sysroot is not given an argument, is ${gcc_tooldir}/sys-root. If the specified directory is a subdirectory of ${exec_prefix}, then it will be found relative to the GCC binaries if the installation tree is moved.

したがって、_/lib /usr/include_を探す代わりに、コンパイル時に/ Toolchain /(libc)と(include files)を探します

確認できます

_arm-linux-gnueabihf-gcc -print-sysroot_

これはlibcを探す場所を示しています。

また

_arm-linux-gnueabihf-gcc -print-search-dirs_

あなたに明確な絵を与えます

14
vinay hunachyal

明らかに、ターゲットとするARM用にコンパイルされたncursesが必要です-ホスト上のものはまったく役に立たないでしょう[ホストがARMプロセッサ-しかし、あなたはx86を言ったので、明らかにそうではありません]。

いくつかの事前に構築されたライブラリが利用可能かもしれませんが、ソースからライブラリを自分で構築するよりも、(特定の条件に合って動作する)ライブラリを見つけるのはもっと難しいと思います-それはそれほど難しいことではなく、ncurses構築するのにそれほど時間はかかりません。

2
Mats Petersson

最初の質問については、クロスコンパイラツールチェーンでncursesライブラリを使用する場合は、アームビルドのバイナリを準備します。

2番目の質問は、std libsでどのように機能するかです。ツールチェーンがプログラムのコンパイル/リンクに使用しているシステムlibc/libmではありません。たぶん、コンパイラの--print-file-name =オプションからそれを見るでしょう:

arm-none-linux-gnuabi-gcc --print-file-name=libm.a

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libm.a

arm-none-linux-gnuabi-gcc --print-file-name=libpthread.so

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libpthread.so

あなたのRaspberryツールチェーンは同じかもしれません。これを試すことができます。

1
TwoCode

Vinayの答えはかなり堅実です。 Raspberry Pi用のncursesライブラリをコンパイルするときの修正だけで、rootfsを設定するオプションは--sysroot=<dir>でなく--with-sysroot。次のコンパイラを使用していたときに見つけたものです。

 arm-linux-gnueabihf-gcc --version 
 arm-linux-gnueabihf-gcc(crosstool-NG linaro-1.13.1 + bzr2650-Linaro GCC 2014.03)4.8.3 20140303(プレリリース) 
著作権(C)2013 Free Software Foundation、Inc。
これはフリーソフトウェアです。コピー条件のソースを参照してください。 
保証はありません。市場性や特定の目的への適合性でさえありません。
1
anaken78