c++ - Unresolved external 尚未定义的构造函数?

标签 c++ class linker

我终其一生都无法弄清楚为什么看不到实现函数并且未解析对构造函数的调用。任何想法将不胜感激。

错误:

1>Debug\MeGLWindow.obj : warning LNK4042: object specified more than once; extras ignored
1>MeApp.obj : error LNK2019: unresolved external symbol "public: __thiscall MeGLWindow::MeGLWindow(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0MeGLWindow@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall MeApp::MeApp(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0MeApp@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>C:\Users\FrizzleFry\documents\visual studio 2012\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe : fatal error LNK1120: 1 unresolved externals

应用标题

#ifndef ME_APP
#define ME_APP

#include "MeGLWindow.h"
#include <string>

class MeApp {

private:
    MeGLWindow* meWind;
    std::string app;

public:

    MeApp() {}
    MeApp(std::string);
    ~MeApp();
    void run();

};


#endif

实现

#include "MeApp.h"

#include <SDL.h>
#include <gl\glew.h>
#include <SDL_opengl.h>
#include <gl\glu.h>
#include <string>

MeApp::MeApp(std::string appName) {

    app = appName;
    meWind = new MeGLWindow(app);


}


MeApp::~MeApp() {

    //delete[] meWind;
    //meWind = NULL;

}

void MeApp::run() {

    bool quit = false;

    //Event handler
    SDL_Event e;

    //Enable text input
    SDL_StartTextInput();

    //While application is running
    while( !quit )
    {
        //Handle events on queue
        while( SDL_PollEvent( &e ) != 0 )
        {
            //User requests quit
            if( e.type == SDL_QUIT )
            {
                quit = true;
            }
            //Handle keypress with current mouse position
            else if( e.type == SDL_TEXTINPUT )
            {
                int x = 0, y = 0;
                SDL_GetMouseState( &x, &y );
                //handleKeys( e.text.text[ 0 ], x, y );
            }


            //meWind->show();
        }

        //Disable text input
        SDL_StopTextInput();
    }
}

窗口标题和实现:

#ifndef ME_GL_WINDOW
#define ME_GL_WINDOW

#include "SDL.h"
#include "GL\glew.h"
#include "SDL_opengl.h"
#include "GL\glu.h"
#include <string>

class MeGLWindow {

private:
    std::string appName;

    int SCREEN_WIDTH, SCREEN_HEIGHT;
    SDL_Window* meWind;
    SDL_GLContext meContext;


public:

    MeGLWindow() {}
    MeGLWindow(std::string);
    ~MeGLWindow();
    void show();

};


#endif

cpp

#include <SDL.h>
#include <gl\glew.h>
#include <SDL_opengl.h>
#include <gl\glu.h>
#include <string>

#include "MeGLWindow.h"
#include <iostream>
#include <string>



MeGLWindow::MeGLWindow(std::string app) {

    appName = app;
    if(SDL_Init( SDL_INIT_VIDEO) < 0) {
        std::cout << "Failed to initilialize SDL!" << std::endl;
        exit(1);
    }

    SCREEN_HEIGHT = 640;
    SCREEN_WIDTH  = 480;

    //Use OpenGL 3.1 core
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 1 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );

    //Create window
    meWind = SDL_CreateWindow( appName.c_str() , SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN );
    if( meWind == NULL )
    {
        std::cout << "Failed to create window!" << std::endl;
        exit(2);
    }

    meContext = SDL_GL_CreateContext( meWind );
    if( meContext = NULL ) {
        std::cout << "Failed to create GL Context!" << std::endl;
        exit(3);
    }

    glewExperimental = GL_TRUE; 
    GLenum glewerror = glewInit();
    if( glewerror != GLEW_OK )
    {
        std::cout << "Error initializing GLEW!" << std::endl;
        exit(4);
    }

    //use vsync
    if( SDL_GL_SetSwapInterval( 1 ) < 0 )
    {
        std::cout << "Unable to set vsync!" << std::endl;
        //printf( "warning: unable to set vsync! sdl error: %s\n", sdl_geterror() );
    }

    //initialize opengl
    //( !initgl() )



}

MeGLWindow::~MeGLWindow() {
    //glDeleteProgram( gProgramID );

    //Destroy window    
    SDL_DestroyWindow( meWind );
    meWind = NULL;

    //Quit SDL subsystems
    SDL_Quit();
}

void MeGLWindow::show() {

    glClear( GL_COLOR_BUFFER_BIT );

    SDL_GL_SwapWindow( meWind );

}

调用文件

#include <SDL.h>
#include <gl\glew.h>
#include <SDL_opengl.h>
#include <gl\glu.h>
#include <stdio.h>
#include <string>

#include "MeApp.h"

int main( int argc, char* args[] )
{
    MeApp app("My Application");

    app.run();

    return 0;
}

编辑

好吧,我认为 .obj 文件可能已损坏,并尝试删除它并重建。他们被重建但仍然给我这个错误。

如果我引入了无意义的代码(我在 MeGLWindow.h 中添加了 a 行作为类成员)并且由于以下原因构建失败了:

1>c:\users\frizzlefry\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\meglwindow.h(22): error C2146: syntax error : missing ';' before identifier 'MeGLWindow'
1>c:\users\frizzlefry\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\meglwindow.h(22): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>
1>Build FAILED.

然后我转到项目目录并删除了整个调试文件夹以保存两个 .dll 文件。

然后我删除了无意义的代码并重新构建了解决方案,但无济于事。我收到了同样的 unresolved external symbol 错误。

当我最初创建这些文件时,我不小心将文件命名为 meGLWindow.h,并且在重命名文件后我开始遇到此错误。它不会让我用大写重命名文件,它会说该文件已经存在。所以我将它重命名为不同的东西,(2MeGLWindow.h) 然后删除项目文件夹中的原始文件并将其重命名回 MeGLWindow.h

然后发生了这个错误(但我已经添加了代码并且不认为这是原因)特别是因为如果我删除 MeGLWindow 函数调用(如 new MeGLWindow(app);)然后没有发生构建错误。仅当我尝试让主函数或应用程序类创建 MeGLWindow 的实例时。

我正在考虑将 pasta 复制到新的解决方案中。但也许解决方案中有某种源文件列表指向我最初创建的错误 meGLWindow.h 文件?

编辑2

刚受够了,是5个文件。我创建了一个新项目,复制粘贴了头文件和 cpp 文件,效果非常好。我再也不会简单地重命名头文件了。

最佳答案

警告 LNK4042 有点欺骗性,实际上它意味着对象 FILE 被指定了不止一次,所以出于某种原因你已经有了 MeGLWindow.obj,并且它不包含 MeGLWindow(std::string),因此出现错误。可能的原因是:

  • Build 无法从尚未实现该构造函数的时间删除旧的 MeGLWindow.obj
  • Build 甚至不会尝试删除旧的 MeGLWindow.obj
  • 一些其他的 MeGLWindow.obj 在正确的构建之前弹出。

解决方案:尝试清理构建/重建/手动删除 Debug/MeGLWindow.obj;仔细检查构建选项,输出文件名。检查安全/UAC/访问权限。希望对您有所帮助。

关于c++ - Unresolved external 尚未定义的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39433053/

相关文章:

c++ - 线程安全和位域

c++ - 如何在不收到编译器警告的情况下初始化 char* args[]

c++ - 当我使用函数 ComboBox_SetCurSel 时,CBN_SELCHANGE 通知不起作用

c++ - 无法在没有初始化的情况下声明类?

c++ - 两个可以相互扩展的库

c++ - 在头文件中声明类对象

c++ - 如何不关心类成员模板

带线程的 C++ 网络类

c++ - 用静态库替换dll

c++ - 与 .so 文件链接 (webkit)