【问题标题】:Changing C++ program entry point. STL crashes更改 C++ 程序入口点。 STL 崩溃
【发布时间】:2013-09-17 15:46:16
【问题描述】:

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

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

我使用以下链接器选项编译它:-e__Z5ENTRYv -nostartfiles
如果没有 /cout/ 行,它可以正常工作,否则它会在 /Access Violation/ 处崩溃

我有什么遗漏的吗?

【问题讨论】:

  • cout 绝不是 C++ STL 的一部分,更不用说 STL。
  • 使用 main 有什么不好?

标签: c++ gcc stl entry-point


【解决方案1】:

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

【讨论】:

  • 即使没有 -nostartfiles 也会崩溃/我正在实现 main(){},什么都不做/。
  • 但是你也覆盖了入口点,那有什么意义呢?我认为您正在为一个非问题创建一个过于复杂的解决方案并遇到麻烦。
  • 问题是 WinMain 需要这么多代码来显示一个简单的窗口,我不希望这些代码在每个 Windows 应用程序的第一个文件中展开。
  • 添加了一种将样板文件隐藏在可重用文件中的方法。
【解决方案2】:

在 C++ 中,main 是一个神奇的函数;编译器可以生成 例如,其中的额外代码用于初始化静态变量。 或者,根据实施情况,这可以由 启动代码。在任何一种情况下,设置一些其他全局符号 作为入口点可能意味着静态变量不会 被初始化。不要这样做:像这样更改入口点 仅当您在任何地方不使用静态变量时才真正有效, 即便如此,它也是摇摇欲坠的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2021-05-08
    相关资源
    最近更新 更多