Thursday, September 13, 2007

最烦不过lnk2019

编程的时候,遇到什么样的问题是最烦人的呢?我想那一定是lnk2019。这种问题是很沮丧的,有时候根本找不到原因。网上倒是能搜索到一些解决方法,但是经常能发现和自己遇到的情况完全不一样。

今天我又遇到一回。是一段例程里的程序,我想用在自己的程序中,就出现这个lnk2019了。本来例程我已经运行通过了,但是在自己的程序中就总是有问题。

例程共有3个文件triangle.h, triangle.c 和 tricall.c。其中头2个文件是个多边形三角抛分的库。第3个文件调用这个库。我在挪到自己程序中的时候,基本上也是这个样子,用一个文件调用那个三角抛分的库。函数什么的也都一致,但是就是出现了lnk2019。因为在我的程序中使用的opengl进行绘制,而例程里没有,所以我开始怀疑是头文件的顺序问题。调整半天也不解决问题。

偶尔在网上看到,如果库文件是在c文件里实现的,那么就要在声明的时候用extern "C",而不是extern,这下我才知道问题的原因。但是在我自己的文件中添加这个声明之后,又出现错误信息C2732说我的这个声明和之前的声明不一致。我又强制在那个库文件中的函数声明之前加上了extern "C",这才把问题解决了。

解决是解决了,但是我还是不明白啊。

5 comments:

Jennifer L said...

正在由C#转C++,痛苦中...

前几天看到报道,一个IT权威(忘了名字了)狠批C++,说C++最悲哀的还不是这种语言本身,而是还有很多的人都在使用它。

我不知道他是不是对的,我觉得我的功力还太浅,无法理解。

billconan said...

我觉得c++还满好的。不过从c过渡到c++确实很痛苦。

Jennifer L said...

不是由C过渡到C++啦,是从C#.更痛苦.不过听到你说它满好,我觉得好些了.但愿如此吧.

Anonymous said...

使用extern "C" 的缘故应该是C++编译的时候不是严格按照源代码申明的那样吧。比如你定义了funcA 实际上C++编译器翻译成funcA_XYZ C源代码是翻译成funcA。

billconan said...

对对,你说的对。传统上认为C是C++的子集,但是实际上有些C的东西C++并不兼容。例如隐式地将void*赋值给其他类型的指针变量。