Ogre 3D错误-LNK1120:1个未解析的外部



我来到了Ogre wiki上的第二个Ogre教程,按照教程的提示重命名了文件并替换了代码,但我得到了这个错误:

    1>------ Build started: Project: Flight Simulator, Configuration: Debug Win32 ------
    1>BaseApplication.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to        '/INCREMENTAL:NO' specification
    1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
    1>C:UsersJuraDocumentsVisual Studio 2010ProjectsFlight SimulatorDebugFlight Simulator.exe : fatal error LNK1120: 1 unresolved externals
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我已经在谷歌上搜索过了,但似乎没有找到答案。

这是来自BasicTutorial2.cpp:的代码

#include "BasicTutorial2.h"
//-------------------------------------------------------------------------------------
BasicTutorial2::BasicTutorial2(void)
{
}

//-------------------------------------------------------------------------------------
BasicTutorial2::~BasicTutorial2(void)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial2::createCamera(void)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial2::createViewports(void)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial2::createScene(void)
{
}

这在我的BasicTutorial2.h文件中:

/*
-----------------------------------------------------------------------------
Filename:    BasicTutorial2.h
-----------------------------------------------------------------------------
This source file is part of the
   ___                 __    __ _ _    _ 
  /_____ _ _ __ ___  / / /  (_) | _(_)
 //  // _` | '__/ _   /  / / | |/ / |
/ _// (_| | | |  __/    /  /| |   <| |
___/ __, |_|  ___|   /  / |_|_|__|
      |___/                              
      Tutorial Framework
      http://www.ogre3d.org/tikiwiki/
-----------------------------------------------------------------------------
*/
#ifndef __BasicTutorial2_h_
#define __BasicTutorial2_h_
#include "BaseApplication.h"
class BasicTutorial2 : public BaseApplication
{
public:
    BasicTutorial2(void);
    virtual ~BasicTutorial2(void);
protected:
    virtual void createScene(void);
    virtual void createCamera(void);
    virtual void createViewports(void);
};
#endif // #ifndef __BasicTutorial2_h_

在目录中,我还有BaseApplication.cppstdafx.cpp,当然还有它们的头文件(BaseApplication.hstdafx.h)。

这就是我的目录结构:

Header files  
   stdafx.h;
   BaseApplication.h;
   BasicTutorial2.h;
Source files
   stdafx.cpp;
   BaseApplication.cpp;
   BasicTutorial2.cpp;

我希望有人能给我解决办法。我尝试将子系统从"Windows"更改为"Console",但没有成功。我也尝试过其他解决方案,但也没有成功。

答案:我忘记将main(win)函数添加到BasicTutorial2.cpp:

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
    int main(int argc, char *argv[])
#endif
    {
        // Create application object
        BasicTutorial2 app;
        try {
            app.go();
        } catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
            MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
            std::cerr << "An exception has occured: " <<
                e.getFullDescription().c_str() << std::endl;
#endif
        }
        return 0;
    }
#ifdef __cplusplus
}
#endif

因此,BasicTutorial2.cpp最终看起来是这样的:

#include "BasicTutorial2.h"
//-------------------------------------------------------------------------------------
BasicTutorial2::BasicTutorial2(void)
{
}

//-------------------------------------------------------------------------------------
BasicTutorial2::~BasicTutorial2(void)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial2::createCamera(void)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial2::createViewports(void)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial2::createScene(void)
{
}
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
    int main(int argc, char *argv[])
#endif
    {
        // Create application object
        BasicTutorial2 app;
        try {
            app.go();
        } catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
            MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
            std::cerr << "An exception has occured: " <<
                e.getFullDescription().c_str() << std::endl;
#endif
        }
        return 0;
    }
#ifdef __cplusplus
}
#endif

因此,对于其他教程,只需相应地更改名称即可。搜索BasicTutorial2并将其替换为BasicTudial3,然后重命名文件,永远不要删除main()函数,因为这会引起很多不必要的麻烦。

最新更新