2013-04-09 23 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

相关问题