.cpp 和 .c 因为符号表不兼容导致的 undifined reference 问题
一般的 undifined reference 几乎99%都是因为没有把有具体函数定义的目标文件(后缀名 .o)链接到当前输出文件中导致的,今天碰到了一种情况是因为符号表不兼容。
很简单,估计也比较常见,但是自己是第一次见。
假设你有一个 mylib.c 文件,内容如下:
//mylib.c
int func(int a) {
return a+42;
}
这个文件你用gcc编译,gcc就会把它当做C程序去编译,用g++编译,g++就会把它当做C++程序去编译。而通过 nm 程序可以打印两者的符号表(T代表这一部分在代码段):
// gcc 符号表
0000000000000000 T print
// g++ 符号表
0000000000000000 T _Z5printi
首先符号表都不一样,众所周知,g++会给函数加前后缀(我知道的一个理由是支持方法重载)。
而如果你有一个 main.c 文件调用 func 函数,例如:
#include "stdio.h"
#include "mylib.h"
int main(void)
{
printf("%d\n", func(32));
}
那么要注意了,你的 main.c 和 mylib.c 必须要统一符号表,否则就会报 undifined reference 错误,至于如何统一符号表,看完上面的废话也应该明白了⑧