.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 错误,至于如何统一符号表,看完上面的废话也应该明白了⑧

posted on 2019-01-16 19:11  daghlny  阅读(316)  评论(0编辑  收藏  举报

导航