C++编译指南
1. 概述¶
提供的工具链目前可支持libstdc++的内容(C++11),支持内容如下:
limits、new、utility、functional、memory、string、vector、list、deque、queue、stack、map、set、bitset、iterator、algorithm、valarray、regex、numeric、mutex、atomic、iostream(仅支持cout)。
在编译C++时注意需要加上编译选项-fno-short-enums -fno-exceptions -fno-rtti -D_GLIBCXX_HAS_GTHREADS -D_POSIX_THREADS -D_POSIX_TIMEOUTS -D_UNIX98_THREAD_MUTEX_ATTRIBUTES
。
libstdc++内容可参考:https://gcc.gnu.org/onlinedocs/gcc-9.1.0/libstdc++/api/modules.html
2. makefile 示例¶
提供一个测试过的makefile供参考,重点是需要加上 -fno-short-enums -fno-exceptions
CROSS_COMPILE := /tools/toolchain/gcc-sigmastar-9.1.0-2019.11-x86_64_arm-eabi/bin/arm-eabi- ARCH ?= -marm CC := $(CROSS_COMPILE)gcc $(ARCH) CXX := $(CROSS_COMPILE)g++ $(ARCH) -std=c++11 AR := $(CROSS_COMPILE)ar INCLUDES := -I./ -I./include CFLAGS := -Wall -fno-short-enums -fno-exceptions -fno-rtti -D_GLIBCXX_HAS_GTHREADS -D_POSIX_THREADS -D_POSIX_TIMEOUTS -D_UNIX98_THREAD_MUTEX_ATTRIBUTES all: $(CXX) $(CFLAGS) $(INCLUDES) -c cpp_test.cpp $(AR) -r libcpp_test.a cpp_test.o clean: rm -rf *.o *.a
3. 常见问题及原因¶
-
结合报错信息,看是否是libstdc++相关的内容报错了。如果是,相应去掉就好了。记得头文件的引用也要去掉。
比如出现undefined reference to ‘std::__cxx11::Basic_string
...之类的 -
uses VFP register ...
解法:加上编译参数 -mfloat-abi=softfp
4. NEON编译¶
一般需要用到C++,大部分原因可能都是因为外链算法库,这里顺便介绍下neon的编译
如果是跟rtos一起编译,就不需要另外加compile-option
如果是先独立成lib再link进rtos,就要加这几个compile-option:
-mcpu=cortex-a7 –c –mfpu=neon-vfpv4 –mfloat-abi=softfp –fno-short-enums –fno-exceptions