C++ arm gcc5的交叉编译-正确使用memcpy

C++ arm gcc5的交叉编译-正确使用memcpy,c++,linux,gcc,arm,cross-compiling,C++,Linux,Gcc,Arm,Cross Compiling,我正在尝试从amlogic为S805/S812 SoC编译内核(uImage)。我已经解决了所有编译错误,除了一个,可能是因为我对C++和编译器的知识还不够。让我解释一下文件phydev.c中存在的问题: 给出错误的行是: memcpy(&phydev->name, &dev_para->name, MAX_DEVICE_NAME_LEN*sizeof(char)); 以下是(交叉)编译器错误: drivers/amlogic/../../../hardware/a

我正在尝试从amlogic为S805/S812 SoC编译内核(uImage)。我已经解决了所有编译错误,除了一个,可能是因为我对C++和编译器的知识还不够。让我解释一下文件phydev.c中存在的问题:

给出错误的行是:

memcpy(&phydev->name, &dev_para->name, MAX_DEVICE_NAME_LEN*sizeof(char));
以下是(交叉)编译器错误:

drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/phydev.c: In function ‘amlnand_phydev_init’:

drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/phydev.c:1114:10: error: passing argument 1 of ‘memcpy’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-array-qualifiers]

   memcpy(&phydev->name, &dev_para->name, MAX_DEVICE_NAME_LEN*sizeof(char));
          ^
In file included from include/linux/string.h:17:0,
                 from include/linux/dynamic_debug.h:111,
                 from include/linux/kernel.h:14,
                 from include/linux/cache.h:4,
                 from include/linux/time.h:4,
                 from include/linux/stat.h:18,
                 from include/linux/module.h:10,
                 from drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/../include/../include/amlnf_type.h:18,
                 from drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/../include/../include/amlnf_dev.h:4,
                 from drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/../include/phynand.h:4,
                 from drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/phydev.c:14:
/root/Downloads/Beelink3/arm-src-kernel-2015-01-15-321cfb5a46/arch/arm/include/asm/string.h:16:15:
 note: expected ‘void *’ but argument is of type ‘const char (*)[16]’

 extern void * memcpy(void *, const void *, __kernel_size_t);
               ^
几天来,我一直在尝试解决这个问题,也尝试直接赋值(这显然对数组不起作用),使用strcpy等等,但这只会产生更多错误,我无法找到确切的根本原因。我想我需要一些类型的铸造或中间常数空隙ptr,但我不知道如何解决这个问题

有谁能给我一些建议和解决方法吗。memcpy函数在arch/arm/include/asm/string.h中定义 但是把这个文件弄乱似乎不是个好主意

非常感谢,


Wim

确实有人非常聪明,能够: 结构phydev{ 常量字符*名称;

删除了常量,一切都很好(至少是memcpy行。但我可以使用strcpy或strdup或其他任何东西。它试图写入常量

在调试完所有其他错误后,我能够生成U-Boot映像。我还没有测试它

另外,使许多函数成为静态函数,而不是将使用过的静态变量复制到局部属性中。不知道它会做什么…(可能会因某些分段错误或其他原因而崩溃:-)

我现在必须等待我的ttl usb适配器

除非有人知道在哪里可以找到adb驱动程序,并且它支持fw_setenv或其他什么

我猜一旦ttl适配器到达,它将按下tty1上的空格键

谢谢大家的帮助。如果我能在这个盒子上安装Ubuntu,我会在博客上发布:-)

干杯,谢谢


Wim

看看
&dev_para->name
。看起来它可能是
const
,函数正在接受一个它可能想要更改的参数。对。复制到const对象是多余的。如果Linux内核真的包含如此草率的代码,我会感到惊讶,所以这里发生了一些更基本的事情。我不知道真正知道C++有什么用。Linux内核是用C编写的,不是C++的。这个错误表明你正在编写一个<代码> const 对象,<代码> PyDeV> > No.<代码>。要解决这个问题,你可以删除<代码> MeMCPY 行;很难说任何有用的代码,而不需要看到更多代码。不要丢掉这个常量。。查看周围的代码,问问自己为什么代码试图更改常量。注意,您需要了解导致这种情况的逻辑错误,以便进行修复,以实现代码所尝试的do@Sam“如果Linux内核真的包含如此草率的代码,我会感到惊讶”-最近我尝试用GCC 5为giggles构建主线stable 2.6.12,我不会;)而且这是一个供应商内核,甚至不是主线,所以标准就在窗口之外;如果它构建的是他们确定的任何硬朗的GCC 4.3,那就“好”了。