2017-12-27 14 views
2

wenn ich versuche, C-Code zu kompilieren, der einen anderen C-Header enthält ich diesen Fehler:Fehler: Funktion deklariert ‚ms_abi‘ wurde hier zuvor erklärt, ohne Aufrufkonvention (Klirren)

x86_64-uefi/../../libk/string.h:9:10: error: function declared 'ms_abi' here was 
     previously declared without calling convention 
KABI int memcmp(const void *d1, const void *d2, uint64_t len); 
     ^
x86_64-uefi/../../libk/string.h:9:10: note: previous declaration is here 

Der Compiler ist Klirren und die beteiligten Dateien sind die folgenden:
memcmp.c

#include "../string.h" 

KABI int memcmp(const void *d1, const void *d2, uint64_t len) { 
    const uint8_t *d1_ = d1, *d2_ = d2; 
    for(uint64_t i = 0; i < len; i += 1, d1_++, d2_++){ 
     if(*d1_ != *d2_) return *d1_ < *d2_ ? -1 : 1; 
    } 
    return 0; 
} 

string.h

#pragma once 

#include "systemapi.h" 
#include "typedefs.h" 

KABI int memcmp(const void *d1, const void *d2, uint64_t len); 

systemapi.h (typedefs definieren nur die uintx_t Typen)

#pragma once 

#define KABI __attribute__((ms_abi)) 

Ein weiterer Header, string.h enthält, libk.h

#pragma once 

#include "string.h" 
#include "systemapi.h" 
#include "typedefs.h" 

Und die Datei, die lib.h enthält und dass Berichte der Fehler beim Kompilieren, main.c (aber alle Dateien melden den Fehler beim Verbinden mit lib.h)

Flags des Compilers: -I/usr/include/efi -I/usr/include/efi/x86_64 -I/usr/include/efi/protocol -fno-stack-protector -fpic -fshort-wchar -mno-red-zone -DHAVE_USE_MS_ABI -c main.c -o main.o

+0

@MichaelPetch Ich änderte die Reihenfolge, aber nichts änderte, gleiche Fehlermeldung – Rottenheimer2

+0

Ich habe eine Zweigstelle in meinem GitHub-Projekt erstellt, so dass Sie dies mit mehr Kontext sehen können: https://github.com/TheStr3ak5/CKA/tree/TheStr3ak5- newABI, erstellen Sie einfach diesen Zweig nach der BUILD-Datei und Sie werden die Fehler sehen. – Rottenheimer2

+0

@MichaelPetch yeah du hast recht, es hat meine Probleme gelöst, Danke! – Rottenheimer2

Antwort

2

Ohne Ihre Build-Umgebung ist, würde eine Vermutung sein, dass Sie in Funktionen der eingebauten neu definieren, die Prototypen, die mit dem ms_abi Funktion Attribut nicht kompatibel sind. Wenn Sie mit -ffreestanding kompilieren und Ihre eigenen Funktionen wie memcpy, memset usw. bereitstellen, sollten Sie in Betracht ziehen, mit -fno-builtin Option zu kompilieren, so dass CLANG/GCC seine eingebauten Formen der Funktionen nicht verwendet, die mit Ihren eigenen kollidieren können.

Verwandte Themen