错误:为函数__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出了问题

我误解了编译器选项。。。在上面的几行中,我的makefile创建了@.via文件,这些文件通过DEFINESINCLUDES

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

并且这些CCD_ 8文件作为用于编译的附加参数而被传递。虽然对于armcc支持--via,请参阅此处,但我发现对于g++-根据gcc文档-语法为@<your_file>。因此,@$@.via所做的只是将$@.via解析为<your_file>.via

现在我仍然收到initializer provided for function错误消息。

更新2:

我发现了问题,并在回答部分解释了发生的事情。请参见下文

根本原因

这个问题的产生是因为我将__asm重新定义为什么都不替换(例如#define __asm(,因为我还不想接触汇编代码。请记住,我说过我正在将ARM移植到x86,所以我认为消除编译错误的最简单方法是删除所有__asm指令,但不考虑这样做的影响。

换句话说,当我包含string.h标头时,标头本身使用汇编调用作为指出的错误消息:

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

当预处理器将CCD_ 20更改为CCD_。

历史的道德

不要重新定义限定符,因为它也会影响您没有直接看到的其他模块,并且更喜欢创建宏而不是仅更改它们(例如/*__asm*/__asm(或仅在代码库中运行sed

最新更新