我正在尝试移植一个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
文件,这些文件通过DEFINES和INCLUDES
@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
。