I'm making a 2D engine in C++, and I want to be able to supply a .dll and a .lib so that games can just include those and everything is fine and dandy.
I've looked at how Ogre does it, and it results in ugliness like this:
#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
    ShadowsApplication 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
While my engine currently does this:
MAIN
{
    Game* game = Game::Create();
    Engine::Init();
    game->Init();
    while (Engine::running)
    {
        if (Engine::PreRender())
        {
            game->Update();
            Engine::Render();
        }
        Engine::ShutDown();
        return 0;
    }
}
Which means a clean game looks like this:
class BouncingBalls : public Game
{
public:
    BouncingBalls() { }
    void Init();
    void Update();
};
Game* Game::Create() { return (new BouncingBalls()); }
Now, one major drawback: because I'm defining main in the engine instead of the game, I can't put all the necessary libraries in the engine. Every game has to load in a specific set of libraries, which is going to be hell when that list changes.
Is there a way to keep the syntax like this while also loading in the .lib's in the engine instead of the game?
Thanks in advance.
EDIT: It seems things were not clear. My eventual goal is to have a single Visual Studio project that contains all of the engine functions, which compiles to a .lib or a .dll (not a .exe). If someone wants to make a game, he can simply include Engine.lib in his project and Engine.dll in his project folder and get going.
It should be as easy as possible to start up a new project, without having to worry about low-level C++.