请允许我以2条评论开头这个问题:
1)我是C#开发人员,所以我在处理C ++中的链接器错误方面没有太多实践,并且一些标准的C ++语法对我来说有点陌生。我怀疑这对那里的C ++专家来说是个简单的问题。
2)我不确定如何以与群众相关的方式提出这个问题,但我愿意接受社区的建议/纠正。 lnk2019错误的问题在于,问题的根源似乎非常个性化。 MSDN has an article通常处理该错误,并且Stack Overflow已经具有带有该标签的slew of questions,但是我似乎仍然无法解决我的问题。

关于细节...
我得到了一个包含42个项目的旧的(VS2005)C ++解决方案,并被要求尝试进行构建。经过一番摸索之后,我将其归结为仅3个无法构建的项目。我只想关注其中一个,因为我认为如果我们能弄清楚一个,就可以对其他两个项目做同样的事情来修复它们。
让我们从错误开始。如您所见,有问题的项目名为“ HttpWire”。


  删除项目“ Http Wire”的中间文件和输出文件,
  配置'Release | x64'编译中... HttpWire.cpp
  编译资源...链接...创建库
  Release \ AMD64 \ HttpWire.lib和对象Release \ AMD64 \ HttpWire.exp
  HttpWire.obj:错误LNK2019:未解析的外部符号“ public:
  __cdecl THttpWire :: THttpWire(char const *)“(?? 0THttpWire @@ QEAA @ PEBD @ Z)在函数中引用
  CreateConnectionWire Release \ AMD64 \ HttpWire.dll:致命错误LNK1120:
  1个未解决的外部


链接器看起来很沮丧,因为函数“ CreateConnectionWire”正在调用“ THttpWire”,但是由于某种原因,链接器无法找到它。项目(HttpWire.cpp)中只有1个.cpp文件,这里是:

#include "THttpWire.h"

BOOL WINAPI DllMain(HINSTANCE hDllInst, DWORD reason, LPVOID reserved)
{
    return TRUE;
}

__declspec(dllexport) TConnectionWire *CreateConnectionWire(LPCTSTR connectionString)
{
    return new THttpWire(connectionString);
}

__declspec(dllexport) void DeleteConnectionWire(TConnectionWire *connectionWire)
{
    delete connectionWire;
}


#include文件“ THttpWire.h”位于另一个名为“ AirTime Core”的项目中。它包括其他几项内容,然后具有以下内容:

class THttpWire : public TConnectionWire
{
public:
    THttpWire(LPCTSTR connectionString);
    virtual ~THttpWire();

... (lots of other stuff) ...
}


最后,我们有了THttpWire.cpp:

#include "THttpWire.h"
...
THttpWire::THttpWire(LPCTSTR connectionString) :
TConnectionWire(connectionString),
hWinHttp(NULL), hSession(NULL), hRequest(NULL),
opTimedOut(FALSE), asyncError(0),
headers(NULL), headersOffset(0), headersLength(0),
availData(0)
{
    requestSent = new TSyncEvent(TRUE);
    updateToString();
}


这种语法对我来说有点奇怪...我们在这里做什么?我的意思是,我意识到这是一个构造函数,并且由于THttpWIre似乎是从TConnectionWire继承(根据.h),所以“:TConnectionWire(connectionString)”是有意义的(我假设这就像C#附加“:base ()”来表示从其他对象继承的对象的构造函数),然后在该对象和左括号之间还有所有其他内容(请注意,TConnectionWire似乎没有从其他任何对象继承)吗?

所以...
在MSDN和SO上进行了一些搜索之后,我了解了以下内容(如果我输入错了,请纠正我)


CreateConnectionWire由__declspec(dllexport)开头,它仅使它可用于使用此.dll的其他项目(如here所述)
LPCTSTR是const char *(请参见MSDN)。请注意,我的项目在属性页中设置为“将wchar_t作为内置类型:否(/ Zc:wchar_t-)”。 (请参见this文章的底部以及this文章)


现在,我的主要怀疑是LPCTSTR。可能在两个项目中定义的定义都不相同,这会产生不同的方法签名...但是我不知道如何检查或修复(如果这样)。或者,也许“ / Zc:wchar_t-”对它产生不利影响?我的下一个怀疑是,构造函数中列出的方法字符串中存在某种东西(使用我不理解的语法),这会引起某种后果问题,通常使“ THttpWire”构造函数不可用。您怎么看?我很乐意分享您认为有用的其他内容。
其他可能会或可能不会有帮助的信息(我会让您决定)


当我第一次开始这个项目时,有几个.lib和.h文件丢失,我不得不四处寻找它们(例如opends60.lib,mssoap30.lib,WinLUA.h等)。我很可能没有该解决方案最初针对的版本。
这些项目都是用定义为“ _WIN32_WINNT = 0x0400”构建的,这似乎意味着它是根据Windows 2000 SDK构建的(请参见MSDN)。我发现我以为是Win 2000 SDK(here上最旧的东西),但是当我链接到该对象时,我会收到更多错误。相反,我链接到SDK版本6.1。但是,这会导致WinHttp不编译,因为未为“ _WIN32_WINNT

最佳答案

项目(HttpWire.cpp)中只有1个.cpp文件


嗯,这是一个问题,因为显然您需要的不止一个。您还需要THttpWire.cpp,因为它包含构造函数代码。链接器找不到的那个。

请记住C ++构建模型,它与C#有很大的不同。源代码文件是单独编译的。然后,链接程序将所有代码位粘合在一起以创建程序。这些位可能来自.cpp文件创建的.obj文件。或者它们可以来自.lib文件,这是一些代码的“容器”。

因为您提到了“ AirTime Core”项目,所以这可能是解释。项目+属性,链接器,输入,其他依赖项设置。无论名称如何,您都需要添加“ AirTime Core”项目的输出。

关于c++ - LNK2019,LPCTSTR和C++语法概述,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21562936/

10-13 08:32