2013-04-09 52 views
0

我正在嘗試爲運行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 

其他的事情我也可以幫助發現問題:

  1. 安裝xenomai相關包(xenomai-runtime,libxenomai1,linux-patch-xenomai
  2. 刪除了一個不同的工具鏈。自從我第一次在我的目標設備中使用Ångström發行版以來,我有一個專門的工具鏈。現在,我轉移到了Debian,並使用binutils-arm-linux-gnueabi package中提供的arm-linux-gnueabi工具鏈。
  3. 編譯了一個新的Linux Kernel和Xenomai(用於我的目標設備)。內核版本是2.6.35.9,Xenomai的是2.5.6。我應該使用早期版本嗎?無論如何,因爲我可以運行預編譯的程序(在Xenomai的安裝過程中,由我自己...編譯),Xenomai已正確安裝。
+1

感謝@artlessnoise,但我嘗試添加'-lrt'並將'-L'和'-I'移到命令行的末尾,我仍然得到相同的錯誤。 正如嘗試錯誤方法我試着寫(例如'-ltnativeee')錯誤的庫名稱和鏈接器輸出的不同的錯誤(_「找不到-lnativeee」 _),這讓我覺得有什麼不對的庫他們自己......你怎麼看? – 2013-04-09 16:23:27

+1

嗯。你的代碼不是C++正確的?你可以在* .../xenomai/lib *目錄下運行'librtdk.a'文件來仔細檢查你有沒有ARM xenomai?還得到'arm-linux-gnueabi-objdump -x librtdk.a | grep rt_print'輸出來確認函數是否在庫中? – 2013-04-09 16:30:05

+0

執行'文件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

回答

0

看起來魔術已經發生在這裏。經過兩天的時間,Makefiles,Xenomai CFLAGS和鏈接器配置混淆後,我發現編譯和鏈接都沒有問題。

我真的沒有做過什麼特別的事情。我沒有(未)安裝任何軟件包(除了我已經有的軟件包),也沒有修改任何環境變量,也沒有爲我的命令行添加任何不同的標誌或參數。我剛剛重新啓動了我的電腦。我甚至沒有故意這樣做,我昨天剛剛離開實驗室,指揮完全不工作,今天早上一切都很順利。奇怪?是。

我想這與終端會話中導出的變量有某種關係。我記得我修改了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 
+0

'-l'和'-L'順序都很重要。我建議你始終將'-lnative'保留爲第一個,因爲我的工具鏈只有在開始時才能鏈接。 – 2013-04-11 14:49:51

相關問題