背景

工作这么多年了,还在记录LNK2019和LNK2001这个感觉有点菜了,但这次一定要记录下这个问题,因为感觉很具有代表性。

感觉改老项目时应该会经常遇到。

关于LNK2019和LNK2001,说白了就是程序在链接时,找不到对应实现的地方,就会报这个错。大多数情况是链接到动静态库时会出现。

我这边出现这个问题的原因,归根结底是管理方面的问题。下面描述下:

有两个同名的.h文件,不在同一个目录,里面的内容还特别的像,刚好这个项目的include都包含了这2个目录。

在Linux上编译及链接一点问题都没有。放到windows上用msvc2010就出现问题了。

过程

QT5的项目,pro文件使用了include包含了当前项目目录和当前目录下新建的一个目录A。都有一个同名的文件XX.h以及对应的XX.cpp。

MSVC编译时无问题,链接时出现LNK2019、LNK2001。

解决方法:

方法一:某一个重名的.h中,使用namespace。并且调用时,需要using。

方法二:不用的那个直接给他.bak,重命名。

其实感觉出现这个问题的本质原因就是:

pro文件中include当前项目目录,和新建目录A。这是根本原因。我感觉这种方式不好原因如下:

① include一般是引用第三方库时,才用的,自己include自己,这个感觉太奇怪了。

② 写代码应该满足面向对象基本原则,至少要写成高内聚低耦合,一样的功能要抽出来放一起,为什么会出现2个同样的文件名(不在同一目录)并且里面还及其相似。这不合理。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐