VS2008(C++)-控制台项目中LNK2005错误的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2008(C++)-控制台项目中LNK2005错误的问题相关的知识,希望对你有一定的参考价值。

我的文件结构是:
--<head.h>--
//定义类
--<function.cpp>--
//定义普通函数
--<main.cpp>--
//主函数

其中主函数和普通函数都用到类,而且已经在head.h中加宏编译:
#ifndef _HEAD_H_
#define _HEAD_H_
/*
...
*/
#endif
为什么有错误“error LNK2005:....(一些类中的public成员函数)在.obj中已定义”之类的话,而如果把普通函数的定义放到主函数文件中没错了呢?

一般来说,除了main.cpp之外,其他如function.cpp之类的文件最好不要被包含,也就是不要写诸如#include"function.cpp"之类的语句,
应该这样写:新建一个function.h,里面写上函数的声明,比如:int add(int a,int b);(注意还要写#ifndef _HEAD_H_
#define _HEAD_H_之类的语句防止重复包含,另防止重复包含的简单方法是写上一句:
#progma once)
然后在function.cpp里面实现.
以后凡是要用到function里面的函数,直接包含function.h就可以了
参考技术A VS2008合vs2005在避免头文件重复编译时
采用了另一种宏#pragma once
你用这个看看

VS2013 C++ LINK:致命错误 LNK1104:无法打开文件“mfc110ud.lib”

【中文标题】VS2013 C++ LINK:致命错误 LNK1104:无法打开文件“mfc110ud.lib”【英文标题】:VS2013 C++ LINK : fatal error LNK1104: cannot open file 'mfc110ud.lib' 【发布时间】:2015-12-08 14:16:58 【问题描述】:

问题的背景(历史):

    从 VC6 到 VS2008 再到 VS2012(全部为 32 位)升级(和微调)这个 50+k 行 C++ 项目后一切正常

    升级到 VS2013 (Premium) 以兼容 3rd 方程序,一切都很好,经过(痛苦的)微调到 Unicode,除了:Edit and Continue (EnC) 不再工作。

    论坛上有几篇关于报告的 EnC 问题的帖子,其中一篇建议在 VS2013 'Ultimate' 中可以使用一项设置(即禁用新的 IntelliTrace,仅在该版本中可用)。注意:MSFT 在 VS2015 中显然已经解决了这个问题,但是第 3 方程序尚未针对该版本进行验证。

    安装了VS2013 Ultimate:一切都很好,但EnC仍然无法正常工作,并且非常想念,例如在微调对话框时;因此

    在 VS2012 中重新打开项目(以便能够使用 EnC),并将 Project > Properties > Config > General > Platform Toolset 更改为“VS110”(VS2012 的名称):

    --> LINK : 致命错误 LNK1104: 无法打开文件 'mfc120ud.lib' (注意:这是 'VS2013' 平台的 MFC 调试 Unicode dll 库)

    现在,当我在 VS2013 IDE 中重新打开项目时,使用相同的 VS110 平台工具集,在构建时会弹出相同的错误,

    当我将平台工具集更改为“VS120”(VS2013 的名称)时,错误变为 LINK:致命错误 LNK1104:无法打开文件“mfc110ud.lib”,这是 VS2012 的 MFC 调试 Unicode 库。 ..

我发现错误的切换和环境令人费解。最后三个步骤是可重复的。 IDE 在任何更改之前关闭。操作系统重新启动会改变什么,如果是,为什么?是否应该删除配置文件(如 .vcxproj、.vcxproj.user、.suo、.sdf、.sln 或其他文件)?

我们将不胜感激所有有助于理解和修复此行为的帮助。

【问题讨论】:

...好吧,我找到了让它再次工作的方法:构建 > 清洁解决方案,然后构建 > 构建解决方案。 这个重建项目编译和链接没有眨眼。但是,这会指向一些隐藏在编译对象中的配置元素吗?我仍然对你的想法感兴趣。干杯。 不是配置,链接需求嵌入在编译器创建的.obj文件中。 MFC 标头包含一个#pragma 注释,以确保链接正确的.lib 文件。因此,如果您切换编译器版本但又没有确保从干净的构建开始,那么您将遇到此问题。可能需要手动删除预编译的头文件 (.pch)。 【参考方案1】:

问题是“字符集”。每个字符集都将构建自己的 *.dll。您必须在“Project -> Properties -> ConfigurationProperties -> Common -> ProjectDefault -> CharSet”中选择“MBCS”而不是“Unicode”。

【讨论】:

【参考方案2】:

我使用的是 VS2012,而我尝试将平台更改为 Win32。错误得到了修复。

【讨论】:

以上是关于VS2008(C++)-控制台项目中LNK2005错误的问题的主要内容,如果未能解决你的问题,请参考以下文章

c++链接器错误LNK2005已经在SDL中定义

由于其他依赖库,在 VS2010 中链接 googleTest 会导致 LNK2005

VS2017项目升级 error LNK2005: "public: __thiscall ATL::CTime::

在将大型 C++ 程序从 VS2005 转换为 VS2008 之前我应该​​知道啥?

C++ 链接器错误 - 错误 LNK2005: ... 已定义

VS2008 VC++/MFC 出错LNK2001与1120