解决'undefined reference to xxx'的编译错误的一个思路

一个小实验

编辑hello.h如下:

#ifndef HELLO_H
#define HELLO_H
    void myprint(const char* name);
#endif

编辑hello.c如下:

#include <stdio.h>
void myprint(const char* name)
{
    printf(name);
    printf("\n");
    _zeqi_printf("end\n");
}

编辑main.c如下:

#include "hello.h"
int main()
{
    myprint("test");
    return 0;
}

执行如下命令进行编译,生成hello.omain.o。:

gcc -c hello.c
gcc -c main.c

执行如下命令生成可执行文件:

gcc hello.o main.o -o hello

会出现以下错误:

/usr/bin/ld: hello.o: in function `myprint':
hello.c:(.text+0x38): undefined reference to `_zeqi_printf'
collect2: error: ld returned 1 exit status

可知出现错误的原因是hello.cmyprint函数中调用的_zeqi_printf函数未定义。

解决问题的方法就是让编译器找到_zeqi_printf的定义。为此,编辑repair.c如下:

#include <stdio.h>
void _zeqi_printf(const char* name)
{
    printf("zeqi_");
    printf(name);
    printf("\n");
}

执行如下命令编译repaire.c,生成repaire.o

gcc -c repair.c

再执行如下命令,成功执行无异常:

gcc hello.o repair.o main.o -o hello

‘undefined reference to xxx’问题的一种解决思路

**适用场景:**一些静态代码分析工具需要对目标源码进行编译才能执行代码分析。若此时编译出现‘undefined reference to xxx’的错误,则可以用该思路解决。

思想是缺什么函数补什么函数。编辑my_repair.c,在该文件中定义好所有‘undefined reference to xxx’错误中缺失的函数,函数的参数个数、参数类型、返回值类型则需要通过逆向分析获取。

定义好my_repair.c之后,编译生成my_repair.o,然后在编译目标程序时,将my_repair.o加入到生成可执行文件的过程中即可。

 Share!