Ошибка: функция, объявленная как ms_abi, ранее была объявлена без соглашения о вызовах (clang)
Когда я пытаюсь скомпилировать код C, который включает в себя другой заголовок C, я получаю эту ошибку:
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
Компилятор - clang, а следующие файлы: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 просто определяют типы uintx_t)
#pragma once
#define KABI __attribute__((ms_abi))
Еще один заголовок, который включает string.h
, libk.h
#pragma once
#include "string.h"
#include "systemapi.h"
#include "typedefs.h"
И файл, который содержит lib.h и сообщает об ошибке при компиляции, main.c
(но все файлы сообщают об ошибке при связывании с lib.h
)
KABI void arch_main(void)
{
// The function does not uses memcmp, just uses the KABI part of lib.h
// Calling the whole lib.h is a convention
}
Флаги компилятора: -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
1 ответ
Без вашей среды сборки обоснованным предположением будет то, что вы переопределяете встроенные функции, имеющие прототипы, которые несовместимы с ms_abi
атрибут функции. Если вы компилируете с -ffreestanding
и поставляя свои собственные функции, такие как memcpy
, memset
и т. д., вы должны рассмотреть возможность компиляции с -fno-builtin
вариант, чтобы CLANG/GCC не использовал встроенные формы функций, которые могут конфликтовать с вашими собственными.