1

Xenomai (2.5.6 / Linux 2.6.35.9) を実行している組み込みアプリケーションの C コードをクロスコンパイルしようとしています。Xenomai の例から始めて、Makefile を使用してコンパイルしようとしましたが、正しく動作しません (さらに、ARM マシン用にクロスコンパイルしたい)。

私はこのチュートリアルに従って、ソースを手動でコンパイルする方法を見つけました。

arm-linux-gnueabi-gcc \
    -I/home/carles/.../xenomai-2.5.6/usr/xenomai/include \ 
    -D_GNU_SOURCE -D_REENTRANT -Wall -pipe -D__XENO__ \
    -lnative \
    -L/home/carles/.../xenomai-2.5.6/usr/xenomai/lib \
    -lxenomai -lpthread -lrtdk \
    rtprint.c -o rtprint

arm-linux-gnueabi-gccARM のクロスコンパイルに使用しているツールチェーンはどこ-I/home/...にあり、 はヘッダーが-L/home/...あるパスであり、すべてのライブラリが配置されているパスです。これらのヘッダーとライブラリは、Xenomai のインストール中にそのフォルダーに配置されます (したがって、ARM 用にビルドされます)。

CFLAGS と LDFLAGS はxeno-configチュートリアルで説明されているように使用して生成されましたが、コマンドを実行すると、次のリンカ エラーが発生します。

$ arm-linux-gnueabi-gcc -I/home/carles/Develop/xenomai-2.5.6/usr/xenomai/include -D_GNU_SOURCE -D_REENTRANT -Wall -pipe -D__XENO__ -lnative -L/home/carles/Develop/xenomai-2.5.6/usr/xenomai/lib -lxenomai -lpthread -lrtdk rtprint.c -o rtprint
/tmp/ccEpFEIl.o: In function `rt_task_spawn':
rtprint.c:(.text+0x34): undefined reference to `rt_task_create'
rtprint.c:(.text+0x54): undefined reference to `rt_task_start'
/tmp/ccEpFEIl.o: In function `task2_func':
rtprint.c:(.text+0x88): undefined reference to `rt_printf'
rtprint.c:(.text+0x98): undefined reference to `rt_task_set_mode'
rtprint.c:(.text+0xa4): undefined reference to `rt_task_sleep'
rtprint.c:(.text+0xb0): undefined reference to `rt_print_buffer_name'
rtprint.c:(.text+0xd4): undefined reference to `rt_fprintf'
/tmp/ccEpFEIl.o: In function `main':
rtprint.c:(.text+0x11c): undefined reference to `rt_print_auto_init'
rtprint.c:(.text+0x128): undefined reference to `rt_print_init'
rtprint.c:(.text+0x140): undefined reference to `rt_task_shadow'
rtprint.c:(.text+0x180): undefined reference to `rt_task_set_mode'
rtprint.c:(.text+0x18c): undefined reference to `rt_task_sleep'
rtprint.c:(.text+0x190): undefined reference to `rt_print_buffer_name'
rtprint.c:(.text+0x1b0): undefined reference to `rt_printf'
collect2: error: ld returned 1 exit status

すべてrt_...の参照は、ライブラリに含まれている Xenomai のカーネル関数です。


EDIT:コマンドラインに追加-lrtして引数を正しく(つまり-L、コマンドラインの最後に)並べても問題は解決しません。ライブラリに関数が含まれていることを確認するために、実行objdumpして次の結果を得ました。

.../usr/xenomai/lib$ arm-linux-gnueabi-objdump -x librtdk.a | grep rt_print
00000000         *UND*  00000000 __rt_print_init
00000000         *UND*  00000000 __rt_print_exit
00000000 R_ARM_JUMP24      __rt_print_init
00000000 R_ARM_JUMP24      __rt_print_exit
librtdk_la-rt_print.o:     file format elf32-littlearm
rw-rw-r-- 1001/1001   6872 Apr  8 16:06 2013 librtdk_la-rt_print.o
00000000 l    df *ABS*  00000000 rt_print.c
00000350 g     F .text  0000012c rt_print_init
00000744 g     F .text  0000003c rt_printf
000007c8 g     F .text  00000010 rt_print_auto_init
000007d8 g     F .text  00000044 rt_print_cleanup
0000081c g     F .text  00000058 rt_print_buffer_name
00000874 g     F .text  00000190 __rt_print_init
00000a04 g     F .text  00000034 __rt_print_exit
000006b8 R_ARM_CALL        rt_print_init
00000850 R_ARM_CALL        rt_print_init

問題を見つけるのに役立つ可能性がある他のこと:

  1. xenomai 関連パッケージのインストール ( xenomai-runtimelibxenomai1linux-patch-xenomai )
  2. 別のツールチェーンを削除しました。ターゲット デバイスで最初にオングストローム ディストリビューションを使用していたので、専用のツールチェーンがありました。現在、Debian に移行し、 binutils-arm-linux-gnueabi パッケージでarm-linux-gnueabi提供されているツールチェーンを使用しています。
  3. 新しい Linux カーネルと Xenomai をコンパイルしました (ターゲット デバイス用)。カーネルのバージョンは 2.6.35.9 で、Xenomai は 2.5.6 です。以前のバージョンを使用する必要がありますか? とにかく、プリコンパイルされたプログラムを実行できるため、Xenomai は正しくインストールされています (皮肉なことに、Xenomai のインストール中に自分でコンパイルしたものです...)。
4

1 に答える 1

0

ここで魔法が起こったようです。Makefile、Xenomai CFLAGS、およびリンカー構成を 2 日間いじった後、コンパイルとリンクの両方が問題なく動作するようになりました。

特に何もしていません。パッケージ (既に持っているものを除く) をインストール (アンインストール) したり、環境変数を変更したり、別のフラグや引数をコマンド ラインに追加したりしていません。コンピューターを再起動しました。私は意図的にそれをしませんでした.昨日、コマンドが完全に機能しない状態でラボを離れただけで、今朝はすべてがうまくいきます. 変?はい。

端末セッションでエクスポートされた変数に何らかの形で関連していると思います。LD_LIBRARY_PATH、CFLAGS、LDFLAGS などをいじったことを覚えているので、問題を解決しようとして何かを台無しにしたに違いありません。Linux 2.6.39.5 を実行する ARM マシン用に Xenomai (2.5.6) アプリケーションをクロスコンパイルするための最終的な作業コマンドを知りたい場合は、次のとおりです。

arm-linux-gnueabi-gcc file_name.c -o file_name         \
    -I/path/to/target/usr/xenomai/include              \
    -D_GNU_SOURCE -D_REENTRANT -Wall -pipe -D__XENO__  \
    -lnative -lxenomai -lrt -lpthread -lrtdk           \
    -L/path/to/target/usr/xenomai/lib 
于 2013-04-11T09:01:07.893 に答える