我正在尝试为运行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