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

相关推荐
virus594532 分钟前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
一匹电信狗38 分钟前
【LeetCode_547_990】并查集的应用——省份数量 + 等式方程的可满足性
c++·算法·leetcode·职场和发展·stl
pride.li42 分钟前
开发板和Linux--nfs服务挂载
linux·运维·服务器
looking_for__1 小时前
【Linux】应用层协议
linux·服务器·网络
Queenie_Charlie1 小时前
小陶的疑惑2
数据结构·c++·树状数组
没差c2 小时前
springboot集成flyway
java·spring boot·后端
时艰.2 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
云泽8082 小时前
不止是命令:Linux 高频指令实战 + 芯片架构底层逻辑
linux·运维·服务器
j_xxx404_2 小时前
Linux:基础IO
linux·运维·服务器
编程彩机2 小时前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂