【问题标题】:error LNK2019: unresolved external symbol error错误 LNK2019:未解决的外部符号错误
【发布时间】:2014-05-12 16:08:31
【问题描述】:

我收到这些错误消息

2>main.obj : 错误 LNK2019: 函数 _WinMain@16 中引用的无法解析的外部符号“public: __thiscall CEngine::CEngine(void)” (??0CEngine@@QAE@XZ)

2>main.obj : 错误 LNK2019: 函数中引用的未解析外部符号“public: void __thiscall CEngine::SetWindowSize(int,int,char const *,int)” (?SetWindowSize@CEngine@@QAEXHHPBDH@Z) _WinMain@16

2>main.obj : 错误 LNK2019: 函数 _WinMain@16 中引用的无法解析的外部符号“public: void __thiscall CEngine::Begin(void)” (?Begin@CEngine@@QAEXXZ)

2>main.obj : 错误 LNK2019: 函数 _WinMain@16 中引用的无法解析的外部符号“public: int __thiscall CEngine::GetDisplayWidth(void)” (?GetDisplayWidth@CEngine@@QAEHXZ)

2>main.obj : 错误 LNK2019: 函数 _WinMain@16 中引用的无法解析的外部符号“public: int __thiscall CEngine::GetDisplayHeight(void)” (?GetDisplayHeight@CEngine@@QAEHXZ)

2>C:\Users\ethan\Desktop\C++ Projects\delveenginetest\Debug\delveenginetest.exe : 致命错误 LNK1120: 5 unresolved externals

这是我的解决方案:

解决方案“delveenginetest”(2 个项目)

DelveEngine

包括

delve.h

引擎.h

SetupSDL.h

stdafx.h

Engine.cpp

Main.cpp

SetupSDL.cpp

这是Engine.h的代码

#pragma once
#include "SetupSDL.h"

class CEngine
{
public:
    CEngine(void);
    ~CEngine(void);

    void SetWindowSize(int winW, int winH, const char* GameName, int windowMode);
    void Begin(void);

    int GetDisplayWidth(void);
    int GetDisplayHeight(void);
private:
    int deskW;
    int deskH;

    bool playing;
    CSetupSDL* sdl_setup;
};

Engine.cpp 的代码

#include "Include/stdafx.h"
#include "Include/Engine.h"

CEngine::CEngine(void)
{
    playing = true;

    deskW = GetSystemMetrics(SM_CXSCREEN);
    deskH = GetSystemMetrics(SM_CYSCREEN);
}


CEngine::~CEngine(void)
{
}

void CEngine::SetWindowSize(int winW, int winH, const char* GameName, int windowMode)
{
    // set up SDL for use
    sdl_setup = new CSetupSDL(winW, winH, GameName, windowMode);
}

void CEngine::Begin(void)
{
    while (playing && sdl_setup->GetMainEvent()->type != SDL_QUIT)
    {
        sdl_setup->Begin();
        sdl_setup->End();
    }

    playing = false;
}

int CEngine::GetDisplayWidth(void){ return deskW; }
int CEngine::GetDisplayHeight(void){ return deskH; }

DelveEngine 项目构建成功,而 delveenginetest 项目失败。

怎么了?我到处找原因,找不到适合我的。

【问题讨论】:

  • 我已经看到了,在这种情况下它对我没有帮助
  • 不相关,但对于 c++ 中的空参数列表,您不需要说 void
  • 我知道这一点。帮助会非常好。
  • '帮助将非常好。' 抱歉,我无法从您发布的内容中找出问题所在。这可能意味着问题出在您在此处提供的信息空间之外(这本质上受您的技能限制)。我对你提到的两个项目以及它们的实际关系有点怀疑。

标签: c++ visual-studio-2013


【解决方案1】:

尽管您没有提供所有足够的信息来正确诊断您的问题,但我将尝试分享我能想象到的可能是链接器错误的原因:

  1. 我想您提到的项目delveenginetest 是为了为DelveEngine 项目中的类设置单元测试。
  2. 由于您的 DelveEngine 项目中有一个 Main.cpp,我猜它只是构建为可执行文件(成功)。
  3. 您的delveenginetest 需要链接到DelveEngine 项目提供的类,但这实际上是不可能的,因为来自DelveEngine.exe 不能用于链接,您需要一个库将其导入另一个可执行文件(单元测​​试框架)。

我建议将您的类/源文件从 DelveEngine 项目中分离出来,以组成一个静态或共享库,可以在单个 VS 解决方案中同时从应用程序和测试框架链接:

Solution 'DelveEngine' (3 projects)  
   DelveEngineLib (project [.lib/.dll])
      Include  
         delve.h   
         Engine.h   
         SetupSDL.h   
      Engine.cpp
      SetupSDL.cpp
   DelveEngine (project [.exe])
      Main.cpp
   delveenginetest (project [.exe])
      Main.cpp (TestFramework main definition)

由于我不是很熟悉它,我实际上不知道,如果 VS 2013 支持设置消耗 虚拟 资源的项目(考虑到实际构建环境中的源链接),但是这可能是一种无需额外库即可设置应用程序和单元测试的替代方法。

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 2021-05-06
    • 2015-05-18
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多