首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当连接ARM的Xenomai程序时未定义的引用?

当连接ARM的Xenomai程序时未定义的引用?
EN

Stack Overflow用户
提问于 2013-04-09 14:57:34
回答 1查看 3.1K关注 0票数 1

我试图为运行Xenomai (2.5.6 /Linux2.6.35.9)的嵌入式应用程序交叉编译C代码。我从Xenomai示例开始,并试图使用它们的Makefiles编译它们,但是它们没有正常工作(另外,我想对我的ARM机器进行交叉编译)。

我遵循了教程,并找到了一种手动编译源代码的方法,恰好是这样的:

代码语言:javascript
复制
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构建的)。

如本教程所述,CFLAGS和LDFLAGS是使用xeno-config生成的,但是当我执行命令时,会得到以下链接器错误:

代码语言:javascript
复制
$ 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并得到了以下结果:

代码语言:javascript
复制
.../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-运行时libxenomai1linux补丁异种)
  2. 删除了不同的工具链。自从我第一次在目标设备中使用ngstr m发行版以来,我就有了一个专门的工具链。现在,我转到了Debian,我正在使用binutils-arm-linux-gnueabi包中提供的binutils-arm-linux-gnueabi包工具链。
  3. 编译了一个新的Linux内核和Xenomai (用于我的目标设备)。内核版本为2.6.35.9,Xenomai版本为2.5.6。我应该使用更早的版本吗?总之,Xenomai是正确安装的,因为我可以运行预编译程序(具有讽刺意味的是,这些程序是在Xenomai安装期间自行编译的.)
EN

回答 1

Stack Overflow用户

发布于 2013-04-11 09:01:07

看来这里发生了魔法。在使用Makefiles、Xenomai和链接器配置两天之后,我已经到了编译和链接工作都没有问题的地步。

我真的没做什么特别的事。我没有安装任何软件包(除了我已经安装的包),也没有修改任何环境变量,也没有在命令行中添加任何不同的标志或参数。我刚刚重启了电脑。我甚至不是故意这么做的,我昨天刚离开实验室,命令不起作用,今天早上一切都很顺利。奇怪?是。

我猜它与终端会话中导出的变量有某种关系。我记得我对LD_LIBRARY_PATH、CFLAGS、LDFLAGS等进行了修改,所以我一定是在尝试解决问题时搞砸了什么。对于那些对交叉编译运行Linux 2.6.39.5的ARM机器的Xenomai (2.5.6)应用程序的最终工作命令感兴趣的人来说,如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15905385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档