在Dll中无法摆脱LNK 2019错误

时间:2013-11-29 19:10:08

标签: c++ dll constructor hyperlink

我一直在这个ctor,ctor-copy ctor-assignment代码上得到2019链接错误,该代码在其他没有错误的项目中有效。我试图将它包含在一个普通的DLL中,该DLL是在检查了MFC支持选项的情况下生成的。我在VS2010。

#include "stdafx.h"

#include "Name.h"

CNameBase::CNameBase()
{

    IsGlobal = false;
    UseShortName = true;
    m_ShortName = NO_NAME_ID ;
    m_Description = "";
    pMe = this;

}

CNameBase::CNameBase( const CNameBase& ref )
{
    m_Description = ref.m_Description;
    IsGlobal = ref.IsGlobal;
    m_LongName = ref.m_LongName;
    m_ShortName = ref.m_ShortName;
    UseShortName = ref.UseShortName;
    pMe = ref.pMe;
}

CNameBase& CNameBase::operator=( const CNameBase& ref )
{
    m_Description = ref.m_Description;
    IsGlobal = ref.IsGlobal;
    m_LongName = ref.m_LongName;
    m_ShortName = ref.m_ShortName;
    UseShortName = ref.UseShortName;
    pMe = ref.pMe;
    return *this;
}

链接错误是:

error LNK2019: unresolved external symbol "public: __thiscall CNameBase::CNameBase(void)" (??0CNameBase@@QAE@XZ) referenced in function "public: __thiscall CName::CName(void)" (??0CName@@QAE@XZ)

1>clayer.obj : error LNK2019: unresolved external symbol "public: __thiscall CNameBase::CNameBase(class CNameBase const &)" (??0CNameBase@@QAE@ABV0@@Z) referenced in function "public: __thiscall CName::CName(class CName const &)" (??0CName@@QAE@ABV0@@Z)

1>clayer.obj : error LNK2019: unresolved external symbol "public: class CNameBase & __thiscall CNameBase::operator=(class CNameBase const &)" (??4CNameBase@@QAEAAV0@ABV0@@Z) referenced in function "public: class CName & __thiscall CName::operator=(class CName const &)" (??4CName@@QAEAAV0@ABV0@@Z)

1>C:\devt\hftappb\Debug\CLayer.dll : fatal error LNK1120: 3 unresolved externals

有趣的是这段代码有效并且有效。 Ctors做他们所支持的事情并且已经在其他解决方案中。我坚持把这个类放在这个文件中,然后突然得到这些我正在解决的错误。我已经比较了这个项目和我知道这个代码可以工作的项目之间的项目设置。还有什么可能导致这个?

2 个答案:

答案 0 :(得分:0)

保存3个函数实现的cpp文件不会编译/链接到exe / dll。

如果您正在使用C ++命名空间,则需要确保header和cpp都使用它。命名空间是类名的一部分。

答案 1 :(得分:0)

谢谢大家回答我的问题。问题花了一天的时间来解决,但我想与其他人分享答案,因为它可能发生在任何人身上。问题的解决方案不是任何代码,而是配置问题。在VS2010中,显然,项目引用的所有文件必须位于解决方案资源管理器中与项目一起出现的文件列表中。我不了解底层架构所以我无法回答为什么这是必需的。从表面上看,没有理由。如果项目中包含的#included文件是明确的或隐式通过Project路径,并且我从解决方案资源管理器中项目文件列表中包含的文件引用了它们的函数,那些文件中的函数应该能够引用文件中的函数不包含在Sol Exp的项目文件列表中。

#include和其他规则的规则在C ++中已经足够复杂,没有MSFT添加它们的混淆层。通过更好的错误报告和/或UI管理,可以轻松防止这些类型的错误。

我所学到的规则就是这样 1.切勿在整个解决方案中复制同一文件的1份以上。同一文件的多个副本很难保持同步,并导致混淆使用哪个。 2.项目中使用的所有文件必须列在该项目中,但应遵守规则1.

Steps (approximate)
1. Create a project
2. Create a .h and .cpp with global functions (or in a class doesn't matter)
3. In the same parent directory as project 1, create project 2  There should be two project directories underneath one parent
4. In project 2 in File Explorer, create a subfolder called Common
5. Create a .h and .cpp in that folder and create a simple function that returns a value
6. Add those files to project 2 in Solution Explorer
7. In Project 1, in the .cpp, create a function that #includes the file for project 2 and calls that function in that file.
8. The compiler generates a 2019 and 2001 unresolved external link error.  What it should do is report that those files are required to be in your project's file list.