【c++】——c++编译的so中函数有额外的字符

0. 代码

c 复制代码
// c
int add(int a, int b) {
    return a + b;
}

用gcc编译成动态库,并用nm看函数名字。

bash 复制代码
gcc -shared -fPIC -o libtest.so add.c
nm -D --defined-only ./libtest.so | grep -E "[Tt]"
0000000000201020 B __bss_start
0000000000201020 D _edata
000000000000056c T _fini
0000000000000460 T _init
0000000000000555 T add

用g++编译成动态库,并用nm看函数名字

bash 复制代码
g++ -shared -fPIC -o libtestc++.so add.c
nm -D --defined-only ./libtestc++.so | grep -E "[Tt]"
0000000000000555 T _Z3addii
0000000000201020 B __bss_start
0000000000201020 D _edata
000000000000056c T _fini
0000000000000468 T _init

如果要g++编译动态的名字不变,需要加上以下代码

c 复制代码
// add.h
#ifdef __cplusplus

extern "C" {
    int add(int a, int b);
}

#endif

// add.c
#include "add.h"

int add(int a, int b) {
    return a + b;
}

1. 原因

这个是 C++ 的名字修饰(Name Mangling) 机制导致的,是 C++ 为了支持函数重载、命名空间、类成员函数等特性,而对函数名进行的特殊编码,最终会在编译后的 SO(共享库)中生成带有额外字符的函数名。

相关推荐
highreport几秒前
net报表工具对比:HighReport 与 FastReport
java·c#
xiaoqiMikko14 分钟前
七条 advisory 各给了一个修复版,而一次修完的那个数字一条都没写
java·spring boot
vHelios14 分钟前
【电商项目】短信测试遇到的问题与解决方案:InaccessibleObjectException报错、单元测试通过但未接收到验证码
java·微服务
学习星球16 分钟前
编辑距离——二维 DP 的“最小操作“艺术
c++·leetcode·java-consul
OPEN-F17 分钟前
ROS2系列教程:tf2坐标变换详解(C++/Python)
开发语言·c++·python
气泡水好喝18 分钟前
Java魔法探秘:从Java代码到CPU指令,一个方法调用的完整生命周期
java
暖焰核心19 分钟前
迭代器与模板的结合——stl的list
c++·windows·list
气泡水好喝24 分钟前
读《阿里巴巴Java开发手册》五年,这7条规约救了我太多次
java
凯哥Java26 分钟前
System.setProperty 的正确姿势:Spring Boot 启动类里的“缺省值“魔法
java·spring boot·后端
lhldsg29 分钟前
智慧场馆解决方案小程序系统:从架构设计到落地实践
java·小程序·需求分析