更改C ++程序入口点。 STL崩溃了

时间:2013-09-17 15:46:16

标签: c++ gcc stl entry-point

所以我可以成功地将C ++入口点更改为类,这有助于我将图形系统初始化与主程序代码隔离开来。但是当我从新主程序中调用一些库代码时,整个程序崩溃了。例如:

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

我用这些链接器选项编译它: -e__Z5ENTRYv -nostartfiles
没有/ cout / line它可以正常工作,否则它会与/ Access Violation / at

崩溃

enter image description here

有什么东西我不见了吗?

2 个答案:

答案 0 :(得分:5)

您认为-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派生您的主类并添加该类型的全局对象。

答案 1 :(得分:3)

在C ++中,main是一个神奇的功能;编译器可以生成 其中的额外代码,例如,初始化静态变量。 或者,根据实施情况,这可以通过以下方式完成 启动代码。在任何一种情况下,设置一些其他全局符号 作为入口点可能意味着静态变量不会 被初始化。不要这样做:改变这样的入口点 实际上只有在任何地方都不使用静态变量时才有效 即便如此,它也不稳定。