C++编译指南

Version 0.1


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