C++ Can';无法消除Dll中的LNK2019错误

C++ Can';无法消除Dll中的LNK2019错误,c++,dll,constructor,hyperlink,C++,Dll,Constructor,Hyperlink,我一直在这个ctor上得到链接2019错误,ctor复制ctor分配代码,在其他项目中没有错误。我试图将其包含在选中MFC支持选项生成的普通DLL中。我在VS2010 #include "stdafx.h" #include "Name.h" CNameBase::CNameBase() { IsGlobal = false; UseShortName = true; m_ShortName = NO_NAME_ID ; m_Description = ""

我一直在这个ctor上得到链接2019错误,ctor复制ctor分配代码,在其他项目中没有错误。我试图将其包含在选中MFC支持选项生成的普通DLL中。我在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

有趣的是,这段代码一直在工作。执行官们做了他们被支持做的事情,并且一直在使用其他解决方案。我将类粘在这个文件中,突然发现这些错误,我无法解决它们。我比较了此项目和我知道此代码适用的项目之间的项目设置。还有什么可能导致这种情况?

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


如果使用C++命名空间,则需要确保头文件和CPP都使用它。名称空间是类名的一部分。

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

<>包含的规则和其他规则在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.

你是用源文件构建的吗?嗯,为什么在一个.cpp文件中有一个#pragma?是的。所有代码都在源代码中。不要输入libs或类似的东西Hans你吓了我一跳。我什么都试过了,但没有拿出来。取出它,同样的结果。我的意思是,实际的源文件在项目中并且正在生成?例如,如果您在显示的源文件中做了一个小的更改并重新生成,源文件会被编译吗?这里不使用名称空间,包括std名称空间。我使用std::string来避免它们。