四月 4, 2017

怪异的 Linker Error LNK2019

Written by

今天碰到一个很奇怪的链接错误:LNK2019.

通常碰到这个问题,都是因为只有申明没有实现导致的。要么是lib库没链接进来,要么是工程中只有头文件,没有添加其对应的cpp文件,导致只有申明没有定义。

而今天碰到的奇葩问题是,同一个工程里,h文件及其对应的cpp文件都在工程中,而且通过h文件中的函数申明按F12键转到定义也没问题,即,申明和定义都没问题。

最后猛然发现, 头文件中对一个类型的预定义出问题了!本来此类型是个struct,结果预定义成了class!

这就很好理解了:由于一个类在头文件中可能要用到另一个类型,又不想在头文件中包含另一个类型的头文件,或者因为循环引用的问题,没法在这里包含另一个类的头文件,则我们在这里先预定义这个类的申明,这样,就可以在头文件中用这个类来申明变量(只能申明指针变量,而不能使用实体,因为实体会真正导致使用另一个类的类定义),然后在cpp文件中才真正包含另一个类的头文件,并为这个预先定义的指针变量new一个实体对象。

那么问题来了,如果在对另一个类做预定义时本来是class,却定义成了struct,或者本来是struct,却错误的定义成了class,那么对于头文件,编译的时候使用的是预定义符号,而cpp文件中由于包含了另一个类的头文件,使用的是真正的申明和定义。

这种错误目前几乎所有编译器都会放过去的,但是链接的时候,目前看gcc编译器是放过去了,但微软的vc链接器包KNK2019链接错误!

这个问题,实在是因为黔驴技穷,耗费了好几个小时后没辙了,所以才打开错误警告才发现的。

 

Category : C/C++

Tags :

发表评论

电子邮件地址不会被公开。

Proudly powered by WordPress and Sweet Tech Theme