Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 链接ARM的Xenomai程序时未定义的引用?_Gcc_Arm_Linker Errors_Xenomai - Fatal编程技术网

Gcc 链接ARM的Xenomai程序时未定义的引用?

Gcc 链接ARM的Xenomai程序时未定义的引用?,gcc,arm,linker-errors,xenomai,Gcc,Arm,Linker Errors,Xenomai,我正在尝试为运行Xenomai(2.5.6/Linux2.6.35.9)的嵌入式应用程序交叉编译C代码。我从Xenomai示例开始,尝试使用它们的makefile编译它们,但它们工作不正常(此外,我想为我的ARM机器交叉编译) 我遵循了教程,找到了一种手动编译源代码的方法,这是一种: arm-linux-gnueabi-gcc \ -I/home/carles/.../xenomai-2.5.6/usr/xenomai/include \ -D_GNU_SOURCE -D_RE

我正在尝试为运行Xenomai(2.5.6/Linux2.6.35.9)的嵌入式应用程序交叉编译C代码。我从Xenomai示例开始,尝试使用它们的makefile编译它们,但它们工作不正常(此外,我想为我的ARM机器交叉编译)

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

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
生成的,但是当我执行该命令时,我得到以下链接器错误:

$ 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相关软件包(,)
  • 删除了另一个工具链。因为我第一次在我的目标设备中使用Ångström分布,所以我有一个专门的工具链。现在,我转到了Debian,我正在使用中提供的
    arm linux gnueabi
    工具链
  • 编译了一个新的Linux内核和Xenomai(用于我的目标设备)。内核版本是2.6.35.9,Xenomai是2.5.6。我应该使用早期版本吗?无论如何,Xenomai安装正确,因为我可以运行预编译的程序(讽刺的是,这些程序是在Xenomai安装期间由我自己编译的…)

  • 看来这里发生了魔法。在花了两天时间处理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 
    

    谢谢@artlessnoise,但是我尝试了添加
    -lrt
    并将
    -L
    -I
    移动到命令行的末尾,但仍然出现了相同的错误。就像试用和出错方法一样,我尝试写错误的库名(例如
    -ltnativeee
    ),链接器输出了不同的错误(“找不到-lnativeee”),这让我觉得库本身有问题。。。你怎么想?嗯,你的代码不是C++正确的吗?您能否在…/xenomai/lib目录中运行
    文件librtdk.a
    ,以再次检查是否有ARM xenomai?还获取
    arm linux gnueabi objdump-x librtdk.a | grep rt_print
    输出以确认函数是否在库中?执行
    file librtdk.a
    I获取
    librtdk.a:当前ar存档
    ,而如果执行
    文件librtdk.so.0.0
    ,则输出结果将是预期的
    librtdk.so.0.0.0:ELF 32位LSB共享对象,ARM,版本1(SYSV),动态链接,
    。执行最后一个命令时,我得到了包含关键字的大约15行,因此我猜函数rt_printf是存在的。当然!我将它添加到问题中,因为它对于注释条目来说太长了。我和你一样难堪,@artlessnoise…无论是
    -l
    还是
    -l
    顺序都很重要。我建议您始终将
    -lnative
    作为第一个工具,因为我的工具链只有在开始时才能够链接。