我正在尝试移植要使用x86_64 C++进行编译的ARM-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
,而原始版本包含[email protected]
。例如:@$(COMPILE) -M -MF $(subst .o,.d.tmp,$@) -MT $@ -E $(C_FLAGS) [email protected] $< -o [email protected]
我将
[email protected]
更改为@[email protected]
,因为我看到在一个较旧的项目中他们这样做了。但是,如果我以[email protected]
的身份离开,我只会得到:SomeFile.c:1:1 fatal error: OneHeader.h: No such file or directory
我开始认为我的
Makefile
是错误的...我误解了编译器选项...上面的几行内容,我的makefile通过定义和来创建
@.via
文件,其中包括 @echo $(patsubst %, '%', $(C_DEFINES)) > [email protected]
@echo $(C_INCLUDE) >> [email protected]
并将这些
@.via
文件作为附加参数传递给编译。虽然armcc
支持--via
see here,但我发现对于g++-根据gcc doc-语法是@<your_file>
。因此,@[email protected]
所做的只是将[email protected]
解析为<your_file>.via
。现在,我仍然收到
initializer provided for function
错误消息。更新2:
我发现了问题,并在答案部分解释了发生的情况。见下文。
最佳答案
根本原因
产生此问题的原因是,由于我不想触摸汇编代码,因此我重新定义了__asm
,使其不被替换(例如#define __asm
)。请记住,我曾说过将ARM移植到x86,所以我认为摆脱编译错误的最简单方法是删除所有这些__asm
指令,但不考虑这样做的影响。
换句话说,当我包含string.h
header 时, header 本身使用程序集调用作为指出的错误提示:
/usr/include/wchar.h:226:20: error: initializer provided for function
__THROW __asm ("wcschr") __attribute_pure__;
当预处理器将
__asm("wcschr")
更改为("wcschr")
时,编译器将遇到错误-这是有道理的。历史道德
请勿重新定义限定符,因为它还会影响您没有直接看到的其他模块,并且更喜欢创建一个宏来更改它们(例如
__asm
的/*__asm*/
)或仅在代码库中运行sed
。