【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(共享库)中生成带有额外字符的函数名。

相关推荐
测试界的小码农38 分钟前
【Linux 命令实战(06):Linux 文件权限管理,掌握 chmod、chown、chgrp】
linux·运维·服务器
文丑颜不良啊1 小时前
LeetCode2761~2780题目解析
java·leetcode
艺杯羹2 小时前
1Panel 装好后 ufw 仍是 inactive:一次服务器安全盲区复盘
服务器·数据库·安全·网络安全·系统架构·实战·1panel
IT枫斗者枫哥2 小时前
子线程断言失败,JUnit 为什么还显示通过?
java·后端
ShineWinsu4 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
女神下凡4 小时前
芯参谋(107):杰理AC_中科蓝讯_开发指南
linux·服务器·网络·单片机·嵌入式硬件
落羽的落羽4 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
考虑考虑4 小时前
JDK27中的Set.ofLazy
java·后端·java ee
文丑颜不良啊4 小时前
LeetCode2841~2860题目解析
java·leetcode
小南家的青蛙4 小时前
Tomcat与Jetty深度对比
java·tomcat·jetty