objdump显示函数名不一致致polynomialSub未定义问题咨询
问题分析与解答
这是C编译器的**名字修饰(Name Mangling)**机制导致的问题——C靠这个实现函数重载,编译器会把函数参数的类型信息编码进符号名里,保证不同参数列表的重载函数拥有唯一的符号标识。
先拆解你看到的符号差异:
- 符号中的
_i是int类型的参数编码,_s是short类型的参数编码 - 你看到的符号遵循Itanium ABI标准(GCC、Clang等编译器常用),结构是:
_Z开头,13是函数名polynomialSub的长度,后面依次是每个参数的类型编码:PKxs代表const unsigned short*(P表示指针,K表示const,xs表示unsigned short)- 核心差异就在中间的参数:
polynomial_arith.o里的函数定义有一个int类型参数(对应_i),但test.o里调用时依赖的函数声明中,该参数是short类型(对应_s)
出现这种情况的原因很明确:
你在polynomial_arith.cpp中定义polynomialSub时的参数类型,和test.cpp里调用该函数前的声明(通常在头文件里)的参数类型不一致——具体是其中一个参数,一个写了int,另一个写了short。而polynomialAdd能正常匹配,说明它的参数类型在定义和声明中完全一致,所以编译器生成的符号名也完全相同。
解决办法就是去核对头文件、polynomial_arith.cpp和test.cpp里polynomialSub的完整函数签名,确保所有参数的类型(包括const修饰、指针/引用、基础类型等细节)完全匹配。
内容的提问来源于stack exchange,提问作者user3078106
相关产品推荐
相关产品推荐

