关于C++的一个LINK错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C++的一个LINK错误相关的知识,希望对你有一定的参考价值。

首先是类的声明头文件里内容如下:
#ifndef _SINGLELINKLIST_H_
#define _SINGLELINKLIST_H_

//-----------------------------------------------
// Name: RESULT(enum)
// DESC: return the method's result
//-----------------------------------------------
typedef enum _RESULT

S_ERROR, S_OK
RESULT;

//-----------------------------------------------
// Name: PolynomialNode(struct)
// DESC:
//-----------------------------------------------
template<class Type>
struct PolynomialNode

Type Coefficient;
int Power;
PolynomialNode<Type> *pNext;

PolynomialNode()

pNext = NULL;

PolynomialNode(Type coe, int power, PolynomialNode<Type> *next = NULL)

Coefficient = coe;
Power = power;
pNext = next;

;

//----------------------------------------------
// Name: CSingleLinkList(class)
// DESC:
//----------------------------------------------
template<class Type>
class CSingleLinkList

protected:
PolynomialNode<Type> *m_pHead;

public:
CSingleLinkList<Type>();
CSingleLinkList(const CSingleLinkList<Type> © );

virtual ~CSingleLinkList();
void Init(); //second step initialization

int Length() const;
inline bool IsEmpty() const return (NULL == m_pHead->pNext);
void Clear()

RESULT GetElemPtr( int position, PolynomialNode<Type> *p) const;
RESULT SetElement( const Type &coefficient, const int &power, int position );//set the element of position
RESULT Insert( int position, const Type coefficient, const int &power) ; //insert element behind the position
RESULT Delete( int position ) //delete node of the position
;

#endif

实现文件中(因为都是一样的错误,所以下面只说二个接口)
template<class Type>
CSingleLinkList<Type>::CSingleLinkList()

m_pHead->pNext = NULL;


void CSingleLinkList<Type>::Init()

Clear();
m_pHead->pNext = NULL;


在main文件中:
#include <iostream>
#include "SingleLinkList.h"
using namespace std;

int main(void)

PolynomialNode<float> *p = new PolynomialNode<float>;
CSingleLinkList<float> *Poly = new CSingleLinkList<float>;
Poly->Insert(1,1.0f,2);
Poly->SetElement(2.0f,2,1);
Poly->GetElemPtr(1,p);
cout<<Poly->Length()<<endl;
system("pause");
return S_OK;


提示的LINK错误如下(同样有多个,但都是一样的所以也只说一个吧):
Polynomial_MAIN.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall CSingleLinkList<float>::Length(void)const " (?Length@?$CSingleLinkList@M@@QBEHXZ),该符号在函数 _main 中被引用

希望能帮帮忙,我搞了很久也不清楚是哪儿的问题。谢谢了
都用vc++ 和vs2008 来编译过的,都提示同样的问题。

总之说来就是整个模板类里的函数一用都会产生LINK错误(最开始测试时没有实例化,只顾编译,所以编译错误也就基本没有的,后来把类一用上,就产生了如上的LINK错误。)应该说来只要解决一个,其它的都是同样的问题,但错误却不知从何而起!

这个应该是你使用的编译器的问题。由于技术问题,很多编译器目前不支持模板类中将类的实现放到cpp文件当中。
因此要把类的实现一块放到头文件中。
当然vs2008好像是支持模板的分开编译的。你也可以选择升级一下编译环境。
^-^。

根据我的猜测,你在实现Length函数的时候会不会在后面忘记添加const
参考技术A 没看到Length函数的实现啊

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。错误得到了修复。

【讨论】:

以上是关于关于C++的一个LINK错误的主要内容,如果未能解决你的问题,请参考以下文章

关于LNK2005的错误

关于OpenOCD+ST-LINK的若干问题

C++ 静态结构类型成员初始化

关于C++模版的一个问题求教,如果取模板类内的一个结构体的指针。

小女子编写C++程序时遇到一个关于Format函数的错误,不知道该怎么修改,希望各位高手帮忙指教!

Visual Studio 2008 中是不是有关于 C++ 编程的教程? [关闭]