Ошибка: инициализатор предоставлен для функции __THROW __asm

Я пытаюсь перенести библиотеку ARM-C для компиляции с x86_64 C++ и получаю следующую ошибку:

In file included from /usr/include/c++/5/cwchar:44:0,
                 from /usr/include/c++/5/bits/postypes.h:40,
                 from /usr/include/c++/5/bits/char_traits.h:40,
                 from /usr/include/c++/5/string:40,
                 from MyFile.h:19,
/usr/include/wchar.h:226:20: error: initializer provided for function
       __THROW __asm ("wcschr") __attribute_pure__;
                     ^

где MyFile.h имеет следующую структуру

// comments
#pragma once
// comments
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string>              //<<< line 19

…

Изначально, вместо того, что давало мне аналогичную ошибку:

In file included from MyFile.h:19:
/usr/include/string.h:73:21: error: initializer provided for function
          __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));
                        ^

Версия компилятора:

GNU C++14 (Ubuntu 5.4.0-6ubuntu1~16.04.11) version 5.4.0 20160609 (x86_64-linux-gnu)
           compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23

Флаги компиляции:

#g++ -O3 -std=c++14 -fpermissive -Wno-system-headers -w

ОБНОВЛЕНИЕ 1:

Я модифицировал Makefile, а исходная версия содержит $@.via. Например:

@$(COMPILE) -M -MF $(subst .o,.d.tmp,$@) -MT $@ -E $(C_FLAGS) $@.via $< -o $@.preprocessed.c

и я изменил $@.via за @$@.viaпотому что я видел, что в более старом проекте они так и поступали. Однако, если я оставлю как$@.via Я просто получаю:

SomeFile.c:1:1 fatal error: OneHeader.h: No such file or directory

Я начинаю думать, что мой Makefile где-то не так...

Я неправильно понял параметр компилятора... Несколькими строками выше мой make-файл создает @.viaфайлы, передающие DEFINES и INCLUDES

       @echo $(patsubst %, '%', $(C_DEFINES)) > $@.via
       @echo $(C_INCLUDE) >> $@.via

и те @.viaфайлы передаются в качестве дополнительных аргументов для компиляции. Хотя дляarmcc в --viaподдерживается см. здесь, я обнаружил, что для g++ - согласно документу gcc - синтаксис@<your_file>. Итак, что@$@.via просто анализирует $@.via к <your_file>.via.

Теперь я все еще получаю initializer provided for function сообщение об ошибке.

ОБНОВЛЕНИЕ 2:

Я нашел проблему и объяснил, что произошло, в разделе ответов. Смотри ниже.

1 ответ

Решение

Основная причина

Проблема возникла из-за того, что я переопределил __asm быть замененным ничем (например, #define__asm) так как я пока не хотел трогать ассемблерный код. Помните, что я сказал, что портирую ARM на x86, поэтому я подумал, что самый простой способ избавиться от ошибок компиляции - удалить все эти ошибки.__asm инструкции, но не принимая во внимание последствия таких действий.

Другими словами, когда я включил string.h заголовок, сам заголовок использует вызов сборки, как указано в сообщении об ошибке:

/usr/include/wchar.h:226:20: error: initializer provided for function
       __THROW __asm ("wcschr") __attribute_pure__;

и когда препроцессор изменил __asm("wcschr") за ("wcschr") компилятор обнаруживает ошибку - что имеет смысл.

Мораль истории

Не переопределяйте квалификаторы, так как это также повлияет на другие модули, которые вы не видите напрямую, и предпочитаете создавать макрос, чтобы просто изменить их (например, __asm за /*__asm*/) или просто беги sed в вашей кодовой базе.

Другие вопросы по тегам