C++编译选项 -fno-rtti 和 -frtti 浅析
问题现象:
客户在移植 C++ 程序的时候遇到了一个符号找不到的问题:
问题描述:
这个类定义在一个静态库中,静态库正常编译,在 Linux 下正常。
查看符号表确实没有这个符号,于是对比了一下编译选项,IDE 下默认是 -fno-exceptions -fno-rtti,打开 -frtti 选项后编译使用正常,对比两次的符号表。
(Makefile 中修改 C++ 编译选项)
打开 -frtti 选项的符号表中编译出了_ZTI12dynamicsBase, 同时编译出来的静态库也变大了。
问题说明:
C++ RTTI 说明:
RTTI (run-time type information or run-time type identification )
运行时类型信息或运行时类型标识是 C++ 编程语言的功能,它在运行时公开有关对象数据类型的信息。
关闭 exceptions、rtti 可以减小程序的占用的空间和提升程序的运行效率,关闭后可能带来一些不兼容问题,使用 typeid 运算符必须开启 RTTI。
Related Articles
GCC浮点相关的编译选项配置
gcc的浮点相关编译选项配置 GCC 中的浮点相关的编译选项属于依赖于不同平台的配置选项, 本文的相关配置都是在 ARM32 平台下. SylixOS 下常用的浮点编译配置有两个 -mfpu=name, -mfloat-abi=name 测试程序 #include <stdio.h> #include <time.h> float calc(float *src_mem_32, float *dst_mem_32) { float mem_32; int i, j; for ...
VxWorks 程序到 SylixOS 之移植指南
一般来说,VxWorks程序又可分为内核程序和应用程序,内核程序又可分为BSP程序和内核模块程序。 本文重点阐述内核程序的移植。 SylixOS如何操作硬件: VxWorks如何操作硬件: 1、工程的选择 VxWorks 工程类型: SylixOS 工程类型: 2、VxWorksBSP中自定义函数被外部模块使用,在SylixOS中需要增加到符号表中,可以通过API_SymbolAddStatic或者LW_SYMBOL宏修饰方式增加。 ...
can not find symbol:xxx(C++)
Q:CPP 程序调用 C 函数编译无问题,运行找不到符号? c++ 中支持函数重载,所以 c 和 c++ 中对同一个函数经过编译后生成的函数名不同,这就会导致一个问题。如果在 c++ 中调用一个使用 c 语言编写模块中的某个函数,c++ 是按照 c++ 的名称修饰方式来查找并链接这个函数,就会发生链接错误。 c函数:void func(),被编译成函数:func c++函数: void func(){},被编译成函数:_Z4funcv 解决方法: 方法一: 可以在c++test.cpp文件中添加 ...
Linux工程移植笔记-基于arping案例
1. arping简介 arp(Address Resultion Protocol)地址解析协议,是通过解析网络层地址来找寻数据链路层地址。 ...
如何解决 IDE 链接文件过多时的栈溢出错误
问:IDE 链接文件过多时的栈溢出错误。 我们在移植时一个大型工程时,IDE可能在最后链接时报了栈溢出的错误,绝大部分情况下原因为需要链接的文件过多,导致最后一条链接命令太长,超过工具限制的 16K 字节。 一般的解决方案为:缩小路径长度,或者将一部分文件打包为一个动态库,最后一起链接,以减少链接命令的长度。但这些方案对于一个标准的工程来说,不太合理。 解决方法: ...