关于error LNK20xx的连接错误

引子

使用VS编译C++程序常常会遇到这种状况:编译已经成功,没有报错;可是连接时报错,相似于:“error LNK2001!@#¥#¥@%#……@#¥%&*&¥%¥@#¥”。网上查到的相关文章和我实际遇到不太同样,在这里总结一下我所遇到的连接错误的解决方式。注:这里不明确指明error LNK的错误代码。linux

1、没有正确的配置XXX.lib

windows编译用到其余的dll库如XXX.dll,不但须要 .h的头文件,并且须要相应的 XXX.lib文件。以前查过说是这个XXX.lib文件是指明了函数的入口地址神马的,但为啥linux下就不须要呢? 回到问题自己,没有正确配置XXX.lib文件有如下几种可能: a)没有在连接的附加依赖项中写入正确的XXX.lib(或者使用#param 在程序中设定); b)搜索库文件的路径上XXX.lib不存在(库文件路径没有设置正确); c)XXX.lib文件有多个版本,而库文件路径上那个版本与你头文件的版本不一致;windows

2、C++类的函数在头文件中声明了,可是在cpp文件中没有对应的定义。

这种错误比较容易发现。错误中会出现函数名。编辑器

3、VS的配置不正确

这个是刚发现,而且昨天折磨了我半个下午。 咱们工程的一个solution中包含多个project,并且project之间有依赖关系——某些的project会用到一些基础project生成的lib。 以前的工程在VS2005上,项目依赖很简单,只要在项目点右键->项目依赖项中勾选被依赖的项目便可。 前几天新装电脑,把工程迁移到VS2013上。已有的旧project都没问题。可是新建项目(也是有项目依赖),老是会报error LNK2001或error LNK2019的连接错误。通过仔细对比新旧项目的差异,甚至对.vcxproj文件作diff排查,发如今VS2013中项目依赖要在通用属性->引用中设置。像VS2005那样只在项目依赖项中设置是不行的。具体的发现的过程以下:函数

  1. 首先排除了前面总结中第二种产生连接错误的可能,连接错误确定是项目属性页中“链接器”项的某些项配置错了。因而将能够不报错的旧项目和新项目点开逐个页对比。在“命令行”选项卡中发现差异: /DYNAMICBASE 项的参数中无连接错误的项目比有错误的多了几行,下图划红线的部分: 命令行差异 而画红线的部分正是项目所依赖project生成的lib。命令行

  2. 对.vcxproj文件作diff 正常连接的项目多了如下的配置:code

    <!-- lang: xml -->xml

    <ProjectReference Include="..\ENOService\ENOService.vcxproj">
         <Project>{050ad614-2864-4ca2-b878-e16d2b07ed33}</Project>
         <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
       </ProjectReference>
       <ProjectReference Include="..\ENOUtils\ENOUtils.vcxproj">
         <Project>{aa57406b-6277-443e-ba0b-8e782ee7ec07}</Project>
         <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
       </ProjectReference>

而“ProjectReference Include”部分正是项目所依赖的project。io

  1. 从上面的两点能够看出是项目依赖出了问题 可是项目依赖项已经配置了啊。问题在哪里呢?偶然间手贱,点开了正常连接项目的属性卡中第一项“通用属性”->“引用”: 项目引用

而连接错误的项目中这一项是空白的。点击“添加新引用”对其进行设置,问题解决! 并且在这里引用了其余项目后,项目右键的“项目依赖项”中的选项是删不掉的。编译

  1. 总结 a)问题本质上来说是没有正确配置lib——没有找到lib文件。 b)VS2005到VS2013有不少变化,但这个原本在2005中不要配置的项在2013中却要配置了算是被MS坑了?也能够说是我没跟上MS的步伐,out了~ c)IDE VS 纯文本。IDE在背后帮咱们作了不少事。可是咱们不了解(我本身水平差,理解不深)。而若是在linux下使用本身写Makefile可已很清楚知道工程全部编译的配置项。甚至当我使用文本编辑器打开了VS的.vcxproj文件,对其中的配置也是一目了然。如今我是愈来愈倾向于纯文本。IDE在随着版本的变化,哪里修改想要的配置?只能呵呵了。
相关文章
相关标签/搜索