cstdlib编译命名空间错误

时间:2014-07-30 10:35:18

标签: c++ std visibility

我正在从Windows 8 64位计算机到ARM-Cortex M交叉编译cpp文件。一切正常但是当我需要stdlib时它会给我以下错误:

C:\Program Files (x86)\GNU Tools ARM Embedded\4.8 2014q2\arm-none-eabi\include\c++\4.8.4/cstdlib:114:1: error: unknown type name 'namespace'
 namespace std _GLIBCXX_VISIBILITY(default)
 ^
C:\Program Files (x86)\GNU Tools ARM Embedded\4.8 2014q2\arm-none-eabi\include\c++\4.8.4/cstdlib:115:1: error: expected ',' or ';' before '{' token
 {
 ^
In file included from C:/mbed/mbed-src/api/platform.h:27:0,
                 from C:/mbed/mbed-src/api/mbed.h:21,
                 from test.cpp:1:
C:\Program Files (x86)\GNU Tools ARM Embedded\4.8 2014q2\arm-none-eabi\include\c++\4.8.4/cstdio:94:1: error: unknown type name 'namespace'
 namespace std
 ^
C:\Program Files (x86)\GNU Tools ARM Embedded\4.8 2014q2\arm-none-eabi\include\c++\4.8.4/cstdio:95:1: error: expected '=', ',', ';', 'asm' or '__attribute__' be
fore '{' token
 {
 ^

我用Google搜索了这一点,我认为可访问性可能会导致Windows出现问题,但我不知道如何修复它。我按照消息来源找到了:

# define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY 1

#if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
# define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V)))
#else

我在c ++ config.h文件中找到了。我的完整g ++命令是:

arm-none-eabi-g++ -v -Os -flto -ffunction-sections -fdata-sections -fno-builtin -Wall -Wextra -pipe -fvisibility=hidden -x c -Os -mthumb -mcpu=cortex-m4 -mfloat
-abi=hard -mfpu=fpv4-sp-d16 -fno-inline -DSTM32F401xC  -DSTM32F401xx -DNDEBUG -DTOOLCHAIN_GCC_CW=1 -IC:/mbed/mbed-src/api -IC:/mbed/mbed-src/hal -IC:/mbed/mbed-
src/targets/hal/TARGET_STM/TARGET_USTM32 -IC:/mbed/mbed-src/targets/cmsis  -IC:/mbed/mbed-src/targets/cmsis/TARGET_STM/TARGET_USTM32 -IC:/mbed/mbed-libs/MicroLC
D -I"C:\Program Files (x86)\GNU Tools ARM Embedded\4.8 2014q2\arm-none-eabi\include\c++\4.8.4" -I"C:\Program Files (x86)\GNU Tools ARM Embedded\4.8 2014q2\arm-n
one-eabi\include\c++\4.8.4\arm-none-eabi" -c test.cpp -o test.o

2 个答案:

答案 0 :(得分:0)

我猜您遗漏了-std=c++11的{​​{1}}或-std=c++03个标记;你能在Linux桌面上编译你的代码吗?

答案 1 :(得分:0)

问题是您将代码编译为" C"代码而不是" C ++"这个编译器标志的代码:

-x c

这当然意味着"命名空间"不是有效的关键字,因为它只存在于C ++中。

尝试将其更改为

-x c++

或者,甚至更好,只需删除它。 Gcc通常从文件结尾(.cpp vs .c)

中计算出来