linux - 为什么编译后.o文件中的函数名与.cc文件中的函数名不同?

标签 linux function compiler-construction makefile g++

我使用以下命令编译了 .cc 文件,该命令位于 Makefile 代码中:

bin/bash ../libtool --silent --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I.
-I.. -I../include/ -I..    -g -O2 -MT rtpsession_inet.lo -MD -MP -MF 
.deps/rtpsession_inet.Tpo -c -o rtpsession_inet.lo rtpsession_inet.cc

.cc 文件中有一个名为 rtp_session_rtp_recv 的函数。但是据说我使用Makefile生成的库时找不到该函数的引用。

于是检查了rtpsession_inet.cc生成的.o文件,发现没有rtp_session_rtp_recv这个函数,而函数名改为了_Z20rtp_session_rtp_recvP11_RtpSessionj

同时,还有其他几个函数更改了名称,例如rtp_session_rtp_send -> _Z20rtp_session_rtp_sendP11_RtpSessionP4msgb

但是诸如rtp_session_set_remote_addr_full之类的函数根本没有改变。

附加字符的含义是什么?我该如何处理这个问题?

我在Linux中编译文件并使用命令

nm rtpsession_inet.o

读取.o文件。 (所有函数包括名称不正确的函数都带有T标签,表示引用存在)

谢谢!

最佳答案

这称为name mangling .

这是为了链接器的利益。 C++ 编译器能够根据参数类型解析多个同名函数。例如,您可能有一个名为 print 的函数,它接受一个 int 参数,另一个函数则接受一个 char* 参数。编译器根据您传递给它的参数类型知道要生成对哪一个的调用。

但是,跨翻译单元的调用必须由链接器解析,链接器通常不知道 C++ 重载规则,并且必须仅根据名称解析调用。因此,C++ 编译器用足够的信息来修饰名称来解决重载问题。

C++ 标准没有指定这是如何完成的,但如果您查看名称,您可能可以弄清楚损坏的名称是如何生成的。

How can I deal with this problem?

编译器和链接器应该正确解析调用。你指的是什么问题?

关于linux - 为什么编译后.o文件中的函数名与.cc文件中的函数名不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18243578/

相关文章:

function - 如何比较 Go 中的 2 个函数?

function - LISP - 通过参数搜索特定函数的程序

C++ 迭代器和循环优化

linux - Tap接口(interface)和/dev/net/tun设备,使用ip tuntap命令

c++ - 如何从 HTML 页面获取字符集

linux - 更好地引用在 shell 脚本上执行命令

python - 如何从 Python 3 的函数内更新全局变量?

compiler-construction - LLVM如何将三个地址LLVM IR `add`转换为X86两个地址 `add`?

objective-c - 在 Objective - C 中不使用未使用的类导入很重要吗?

linux - 关于计算 gvim 中的列数