不为以前所知的LNK2019问题

来源:互联网 发布:重庆商品房交易数据 编辑:程序博客网 时间:2024/05/01 12:56

今天将一个vs7.1的网络游戏项目转化为2005,一个解决方案中几个项目,有依赖关系,重新设置了正确的依赖关系,但编译总是出现LNK2019错误。

 

原方案中明显不了解“项目依赖项”的作用,而是在“额外依赖项”中把同一解决方案中几个项目生成的lib都放进去了,而且乱设置编译开关,结果一到2005中,立即就出现连接错误。

 

反复修改编译了半天,还是连接出错。

 

最后,想了想可能是自己对LNK2019错误的认识不够,于是运行msdn,索引“LNK2019”,仔细阅读,并看本项目的出错情况,终于发现了函数参数中有wchar_t。

 

而msdn2005说:“可能不是所有模块都使用相同的 /Zc:wchar_t 设置编译的,这样,类型引用便没有解析为可兼容的类型。要解决此问题,请确保所有模块中的类型都是兼容的,方法是使用相应的 /Zc:wchar_t 设置进行编译(例如,要使用 Visual C++ 2005 工具集生成与以前版本中的模块链接的模块,请使用 /Zc:wchar_t-),或者尽可能更新类型以使其兼容。”

 

把解决方案中各个项目的/Zc开关检查了下,发现其中2个项目把C/C++----语言-----“将wchar_t视为内置类型”(/Zc)关了,选择“是”,连接成功。

 

注:/Zc开的情况下,函数参数unsigned short*和wchar_t*是不匹配的,因为wchar_t是个内置类型,而不是宏定义。unsigned short也是一个类型,两者的区别,就像int和string之间差距一样大。编译器会将他们当作不一样的,而且不能强制转换。定义的函数,也会变成多态,而不会出现重定义错误。

 

void func(unsigned short*)和void func(wchar_t*)是两个函数。

 

如果定义了void func(unsigned short*),而用wchar_t* t=L"";func(t),就会出现连接错误,找不到该符号。要想能这样调用,就要关闭/Zc。

 

感受:如果发现网上的各种解释都不能解决问题时,还是查阅下msdn,msdn永远比搜索引擎靠谱:-)

原创粉丝点击