gcc — Изменение точки входа в программу C ++. STL падает

Таким образом, я могу успешно изменить точку входа C ++, чтобы быть в классе, что помогает мне изолировать инициализацию моей графической системы от основного программного кода. Но когда я вызываю какой-то библиотечный код из нового главного, вся программа падает. Например:

#include <iostream>
using namespace std;
int ENTRY(){
cout << "hello from here" << endl;
system("pause");
}

Я компилирую это с этими вариантами компоновщика: -e__Z5ENTRYv -nostartfiles
Без / cout / line он работает нормально, иначе он падает с / Access Violation / at

введите описание изображения здесь

Я что-то упускаю?

2

Решение

Что именно вы думаете -nostartfiles делает?

Он подавляет инициализацию CRT, которая, помимо прочего, отвечает за вызов глобальных конструкторов. Без глобальных конструкторов, cout не инициализирован. Без инициализации ваша программа идет бум.

Зачем связываться с этим в любом случае? Разве не было бы легче просто связать в небольшой шаблон main? Это может выглядеть так:

// app.hpp
class App {
protected:
App();
virtual ~App();
private:
virtual int run(/*args if you want them*/) = 0;
int startup(/*args if you want them*/);
friend int app_run(/*args if you want them*/);
};

// app.cpp: just add this to your project
namespace { App* the_app; }
App::App() { the_app = this; }
App::~App() {}

int App::startup() {
// Add whatever code you want here, e.g. to create a window.
return run();
}

int app_run() { return the_app->startup(); }

int main() { return app_run(); }
int wmain() { return app_run(); }
int WinMain(HINSTANCE, HINSTANCE, char*, int) { return app_run(); }
int wWinMain(HINSTANCE, HINSTANCE, WCHAR*, int) { return app_run(); }

Теперь просто выведите свой основной класс из App и добавьте глобальный объект этого типа.

5

Другие решения

В C ++ main магическая функция; компилятор может генерировать
дополнительный код в нем, например, для инициализации статических переменных.
Или, в зависимости от реализации, это может быть сделано
код запуска В любом случае, установка другого глобального символа
как точка входа, вероятно, будет означать, что статические переменные не будут
быть инициализирован. Не делай этого: меняй точку входа вот так
действительно только в том случае, если вы нигде не используете статические переменные,
и даже тогда это шатко.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector