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

相关推荐
jxy999810 小时前
mac mini 安装java JDK 17
java·开发语言·macos
独望漫天星辰10 小时前
C++ 树结构进阶:从工程化实现到 STL 底层与性能优化
开发语言·c++
biyezuopinvip10 小时前
基于Spring Boot的企业网盘的设计与实现(毕业论文)
java·spring boot·vue·毕业设计·论文·毕业论文·企业网盘的设计与实现
HellowAmy10 小时前
我的C++规范 - 鸡蛋工厂
开发语言·c++·代码规范
Hx_Ma1610 小时前
SSM搭建(三)Spring整合SpringMVC框架
java·后端·spring
无风听海10 小时前
.NET10之ASP.NET Core的Filter管线
java·asp.net·.net
少许极端10 小时前
算法奇妙屋(二十八)-递归、回溯与剪枝的综合问题 1
java·算法·深度优先·剪枝·回溯·递归
looking_for__10 小时前
【Linux】应用层自定义协议与序列化
linux·服务器·网络
仰泳的熊猫10 小时前
题目1453:蓝桥杯历届试题-翻硬币
数据结构·c++·算法·蓝桥杯
rainbow688910 小时前
C++STL list容器模拟实现详解
开发语言·c++·list