Ошибка: для функции предусмотрен инициализатор __THROW __asm - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь перенести библиотеку 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 doc - синтаксис @<your_file>. Таким образом, то, что @$@.via делает, просто анализирует $@.via в <your_file>.via.

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

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

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

1 Ответ

0 голосов
/ 07 ноября 2019

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

Проблема возникла из-за того, что я переопределил __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 в своей кодовой базе.

...