由于之前一直从事linux下的嵌入式开发,对于windows下的工程环境配置,lib链接,dll链接等等都不是很敏感。经过一些时间的摸索和实践,基本的一些配置选项都玩得差不多了。对于常见的错误都能知道怎么去下手解决,但最近把项目把移植到64位操作上,重新编译所有的dll的时候。发现几个link问题还是不能很快的解决,几个链接的错误摸索了好几天,最后都是因为配置问题引起的,各种郁闷,原来VS下面果真没有linux来的那般方便。跑偏了,言归正传,总结一下遇到的几种比较典型link的错误,
1、查看库的引导路径以及库的名称,如果是导入DLL的话,注意DLL导出接口的lib库文件。配置如下:
左边配置好需要的路径,右边加载需要的库文件的名称即可。
一般情况下如果配置好上面的情况并且在工程目录加入dll的话,程序就能正常运行了,这也是大多数论坛上回复很多人link错误的答案。但是有时候其他的配置没有匹配的话,也会link错误的。
2、注意宽字节问题。先来看看我自己链接时候的错误
出现这个错误的时候,刚开始我也是莫名其妙的,因为我对于第一条中提到的配置问题,我都已经设置好了,确认没有问题的。后来怀疑编译这个开源的时候没有成功导出接口,所以又借助Depends看了下,如下图:
发现接口也都成功导出了呀,并没有什么问题。后来思量再三,问了下老大,结果他看了半天也是无从下手。后面没有办法,老大竟然对比了函数导出名称后面的数字竟然发现是不同的,我也仔细看了,红色框框部分,确实不同,姜果然是老的辣,一语击中要害。原来我生成的dll设置了宽字节,而链接这个dll的时候不需要没有,导致出现链接不上,又来修改了设置如下:
修改后,编译连接成功。纠结了蛮久的问题终于解决。这也是link错误的一个比较隐藏的错误。
当然在其中还有另外两个地方的设置,也会引起link的错误的。
3、字节编码的设置问题
4、RunTime Library的设置问题
各个选项的具体说明可以参考David的博客,说的比较清楚,这里的设置问题也会引起link错误。
最后总结下,link错误千千万,很多情况都会出现各种纠结的link问题,遇到问题不要急躁,细心仔细对比,首先确认链接问题,然后是否成功导出,查看导出和调用接口差异,确认各个可能引起链接错误的配置信息等等,一步一步缩小范围。