STM32 C/C++ GCC Flags

STM32 C/C++ GCC Flags

参考:

https://github.com/MaJerle/stm32-cube-cmake-vscode

编译器Flags

C/C++编译器前置Flags

-fdata-sections

  • 这个编译器标志告诉 GCC 将每个数据段(例如全局变量和静态变量)放入其自己的段中。默认情况下,所有的数据都放在一个或几个数据段中。通过将每个数据项放入单独的段,链接器可以使用 --gc-sections 选项来移除未引用的数据段,从而减少最终二进制文件的大小。

-ffunction-sections

  • 类似于 -fdata-sections,这个标志将每个函数放入其自己的段中。这样,如果某个函数没有被程序引用,链接器可以移除包含该函数的整个段,节省空间。

-Wl,--gc-sections

  • 这个链接器选项告诉链接器(通常是 GNU 链接器 ld)在生成最终的可执行文件或库文件时,移除未使用的段。这些未使用的段可能包含未被引用的函数、变量或其他数据。这个选项与 -fdata-sections-ffunction-sections 结合使用,可以有效地减少二进制文件的大小,因为它允许链接器移除程序中未使用的部分。

C++ Specific Flags

-fno-rtti

  • 禁用运行时类型识别(RTTI):这个标志禁用了 C++ 的运行时类型识别机制,这意味着程序在运行时无法使用 dynamic_casttypeid 操作。禁用 RTTI 可以减少程序的体积和提高性能,因为编译器不需要生成和处理类型信息。

-fno-exceptions

  • 禁用异常处理:这个标志告诉编译器不要生成用于异常处理的代码。在 C++ 中,异常处理是一个强大的特性,但也会引入额外的代码和运行时开销,比如异常表的生成和堆栈展开逻辑。禁用异常处理可以减少程序的大小和提高性能,特别是在不需要异常处理的嵌入式系统或性能敏感的应用中。

-fno-threadsafe-statics

  • 禁用线程安全静态初始化:在 C++ 中,如果一个静态局部变量在多个线程中被初始化,编译器默认会添加额外的代码来确保初始化的线程安全性,以避免所谓的 “静态初始化顺序问题”。这个标志禁用了这种线程安全的保护,可以减少一些运行时开销。但是,需要注意的是,如果你的程序在多线程环境中运行,并且确实需要线程安全初始化,那么禁用这个保护可能会导致不可预测的行为。

MakeFile To CMake

Essential things described in CMakeLists.txt file:
CMakeLists.txt文件中描述的基本内容:

  • Toolchain information, such as GCC configuration with build flags
    工具链信息,例如带有构建标志的 GCC 配置
  • Project name 项目名称
  • Source files to build with compiler, C, C++ or Assembly files
    使用编译器、C、C++ 或汇编文件构建的源文件
  • List of include paths for compiler to find functions, defines, ... (-I)
    编译器查找函数、定义等的包含路径列表( -I
  • Linker script path 链接器脚本路径
  • Compilation defines, or sometimes called preprocessor defines (-D)
    编译定义,有时称为预处理器定义( -D )
  • Cortex-Mxx and floating point settings for instruction set generation
    用于指令集生成的 Cortex-Mxx 和浮点设置
posted @ 2025-05-07 12:02  c17VV  阅读(62)  评论(0)    收藏  举报