我正在嘗試爲運行Xenomai(2.5.6/Linux 2.6.35.9)的嵌入式應用程序交叉編譯C代碼。我從Xenomai的例子開始,嘗試使用他們的Makefiles編譯它們,但它們工作不正常(此外,我想爲我的ARM機器進行交叉編譯)。當爲Xen連接Xenomai程序時,爲什麼我會有未定義的引用?
我已經按照this教程,並找到一種方法來手動編譯源代碼,這恰好是這一個:
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-gcc
是我使用的工具鏈交叉編譯爲ARM, -I/home/...
是標題所在的路徑,-L/home/...
是所有庫所在的路徑。這些頭文件和庫在Xenomai安裝期間放置在那些文件夾中(因此它們是爲ARM構建的)。使用xeno-config
在本教程中陳述產生
CFLAGS和LDFLAGS,但是當我執行命令,我得到下面的連接錯誤:
$ 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的內核函數庫。
編輯:添加-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
其他的事情我也可以幫助發現問題:
- 安裝xenomai相關包(xenomai-runtime,libxenomai1,linux-patch-xenomai)
- 刪除了一個不同的工具鏈。自從我第一次在我的目標設備中使用Ångström發行版以來,我有一個專門的工具鏈。現在,我轉移到了Debian,並使用binutils-arm-linux-gnueabi package中提供的
arm-linux-gnueabi
工具鏈。 - 編譯了一個新的Linux Kernel和Xenomai(用於我的目標設備)。內核版本是2.6.35.9,Xenomai的是2.5.6。我應該使用早期版本嗎?無論如何,因爲我可以運行預編譯的程序(在Xenomai的安裝過程中,由我自己...編譯),Xenomai已正確安裝。
感謝@artlessnoise,但我嘗試添加'-lrt'並將'-L'和'-I'移到命令行的末尾,我仍然得到相同的錯誤。 正如嘗試錯誤方法我試着寫(例如'-ltnativeee')錯誤的庫名稱和鏈接器輸出的不同的錯誤(_「找不到-lnativeee」 _),這讓我覺得有什麼不對的庫他們自己......你怎麼看? – 2013-04-09 16:23:27
嗯。你的代碼不是C++正確的?你可以在* .../xenomai/lib *目錄下運行'librtdk.a'文件來仔細檢查你有沒有ARM xenomai?還得到'arm-linux-gnueabi-objdump -x librtdk.a | grep rt_print'輸出來確認函數是否在庫中? – 2013-04-09 16:30:05
執行'文件librtdk.a'我得到'librtdk.a:當前AR archive',而如果我執行'文件librtdk.so.0.0.0'輸出最終被預期'librtdk.so.0.0.0: ELF 32位LSB共享對象,ARM,版本1(SYSV),動態鏈接,...'。執行最後一條命令,我得到了包含關鍵字的15行,所以我猜測函數rt_printf存在。 – 2013-04-09 16:39:52