关于Link时函数未找到(未定义)的问题

问题描述

用cube生成了一个STM32F4的工程,移植了一个tcp客户端的.c和.h文件,报错如下

关于Link时函数未找到(未定义)的问题

关于Link时函数未找到(未定义)的问题

关于Link时函数未找到(未定义)的问题

解决过程

先尝试用"Go to definition"跳转,结果无法跳转,检查头文件也已包含

关于Link时函数未找到(未定义)的问题

确认是否包含"dns.h"文件路径,确实已包含

关于Link时函数未找到(未定义)的问题

进入"dns.h"与"dns.c"确认该函数是否存在,的确存在(源码怎么可能不存在),调用也没问题,的确是本工程目录下的"dns.h"

关于Link时函数未找到(未定义)的问题

关于Link时函数未找到(未定义)的问题

但是发现不是本工程的成员。

关于Link时函数未找到(未定义)的问题

嗯?为什么文件的确在这个工程目录下但不是本工程的成员呢?不解,于是手动添加"dns.h"文件到工程,虽然下面那句“不是本工程的成员”不见了,但是还是报一样的错误。

怀疑工程问题,于是重新生成,无果……

怀疑移植的文件有问题,自己新建.c.h文件,然后复制原文件代码,没用……

怀疑重复包含头文件,并不是……

小小的眼睛,大大的疑惑

wdnmd一下午过去了

为什么明明和STM32H7的工程一样到STM32F4就不行了呢?

为什么明明include了却不能编译呢?

没编译?嗯?是不是有宏定义没开?

关于Link时函数未找到(未定义)的问题

关于Link时函数未找到(未定义)的问题

………………

………………

………………

真就没开呗

原来用cube生成工程的时候LwIP的DNS默认是关掉的……

关于Link时函数未找到(未定义)的问题

所以"dns.c"和"dns.h"文件根本没有被编译自然就找不到这个函数了

总结

一般找不到函数多半是没有include那个头文件,或者头文件互相引用导致,我这边的原因比较智障,从中吸取了不少经验教训,明明include了声明该函数的头文件,却没找到,极有可能是因为该文件没有编译,没有编译的原因如果不是该文件不在同一个工程目录下或者未被包含入该工程,那么肯定是这个头文件里有什么宏定义没有被打开,其实头文件互相引用也属于这种情况。

以上。。