Ich versuche, einen Kernel (uImage) für das S805/S812 SoC von amlogic zu kompilieren. Ich habe es geschafft, alle Kompilierungsfehler bis auf einen zu lösen, wahrscheinlich weil meine Kenntnisse von C++ und Compilern nicht weit genug reichen. Lassen Sie mich erklären, das Problem, das in einer Datei phydev.c existieren:Kreuzkompilierung für Arm gcc5 - Korrekte Verwendung von memcpy
Die Linie den Fehler gibt, ist:
memcpy(&phydev->name, &dev_para->name, MAX_DEVICE_NAME_LEN*sizeof(char));
Dies sind die (Kreuz) Compiler-Fehler:
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);
^
I habe versucht, dies für mehrere Tage herauszufinden, auch versuchen direkte Zuweisung (die offensichtlich nicht auf Arrays funktioniert), mit Strcpy statt und so weiter, aber das ergibt nur mehr Fehler und ich kann nicht die genaue Ursache finden. Ich denke, ich brauche eine Art von Besetzung oder dazwischen konstantes void ptr, aber ich habe keine Ahnung, wie ich das beheben kann.
Könnte jemand so freundlich sein, mir Ratschläge zu geben und wie man es löst. Die memcpy Funktion ist in arch/arm/include/asm/string.h definiert. Aber es schien keine gute Idee zu sein, mit dieser Datei zu spielen.
Vielen Dank,
Wim
Werfen Sie einen Blick auf '& dev_para-> name'. Es scheint, als wäre es "const" und die Funktion nimmt einen Parameter, den sie ändern möchte. – wally
Rechts. Kopieren in ein const Objekt ist verbotten. Ich wäre überrascht, wenn der Linux-Kernel tatsächlich solchen schlampigen Code enthält, also läuft hier etwas Grundlegenderes. Und ich weiß nicht wirklich, was C++ damit zu tun hat. Der Linux-Kernel ist in C geschrieben, nicht in C++. –
Der Fehler zeigt an, dass Sie versuchen, ein 'const' Objekt zu schreiben,' phydev-> name'. Um das zu lösen, könntest du die 'memcpy' Zeile löschen; Es ist schwer, etwas nützlicheres zu sagen, ohne mehr Code zu sehen. Werfen Sie die const nicht weg.Sehen Sie sich den umgebenden Code an und fragen Sie sich, warum der Code versucht, eine Konstante zu ändern. –