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

相关推荐
我命由我123453 分钟前
PHP - PHP 简易 Web 服务器、基础接口开发
服务器·开发语言·前端·php·intellij-idea·idea·intellij idea
咖喱o5 分钟前
IPv6
服务器·前端·网络
咩咦6 分钟前
C++学习笔记21:日期类加减天数
c++·学习笔记·运算符重载·日期类·operator+·operator+=
IpdataCloud6 分钟前
IP查询工具怎么选?在线API vs IP离线库:精度、速度、成本、隐私全对比
服务器·网络·数据库
闪电悠米7 分钟前
黑马点评短信登录01_session_sms_login
java·spring boot·redis·git·spring·面试
努力努力再努力wz7 分钟前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
Harm灬小海7 分钟前
【云计算学习之路】学习Centos7系统:Linux磁盘管理
linux·运维·服务器·学习·云计算
少司府8 分钟前
Tools相关:深入浅出学Git
大数据·c++·git·gitee·github·仓库·分支
Advancer-8 分钟前
黑马点评plus --异步秒杀重构升级
java·spring boot·重构·intellij-idea
神仙别闹10 分钟前
基于MFC(C++)实现(界面)学委作业管理系统
开发语言·c++·mfc