36

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

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

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

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

4

5 に答える 5

17

クエリについて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

鮮明な画像を提供します

于 2013-09-20T15:52:50.260 に答える
2

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

ncurses利用可能なビルド済みのライブラリがいくつかあるかもしれませんが、ライブラリをソースから自分でビルドするよりも、(機能し、特定の条件に一致する)ライブラリを見つける方が手間がかかると思います-それほど難しくはないはずです。構築するのに数分。

于 2013-09-19T17:13:39.190 に答える
1

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

arm-linux-gnueabihf-gcc --バージョン
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) 4.8.3 20140303 (プレリリース)
Copyright (C) 2013 Free Software Foundation, Inc.
これはフリー ソフトウェアです。条件のコピーについてはソースを参照してください。いいえ
保証; 商品性や特定の目的への適合性のためでさえありません。
于 2015-01-24T17:31:28.917 に答える