【问题标题】:Why does static library contain a main function?为什么静态库包含主函数?
【发布时间】:2017-03-23 17:36:16
【问题描述】:

我遇到了一个奇怪的静态库,其中包含一个 main() 函数 (C++)。
我只是想知道它的目的是什么。

main() 是如何执行的?

【问题讨论】:

  • 它会像任何主程序一样执行吗? (反正只能有一个)至于目的何不问问图书馆的作者?

标签: c++ static-libraries main


【解决方案1】:

我只是想知道它的目的是什么。

在单元测试或图形/游戏引擎框架中,定义可执行程序的main() 入口点并绑​​定来自某些工厂模式模板的自定义类定义是一种常用技术。

main() 是如何执行的?

根据定义,它是任何 c++ 程序的主要入口点,因此由程序启动链接描述文件触发执行。


使用这些东西意味着您将客户端类编写在可执行项目中,将它们与框架绑定,并省略定义main() 函数。

【讨论】:

  • 您的答案描述的是控制反转,或 Spring Boot 等框架使用的 IoC 开发模式。这就是它得名的地方,因为与经典库模式相比,它是完全相等/相反的。换句话说,它是相同的模式,但库(框架)充当应用程序,而应用程序只是定义配置并给出值/实现。现在它变得有点复杂,但这是最初的想法。
【解决方案2】:

从链接器的角度来看,main 函数在哪里并不重要——它可以在静态库中,也可以在独立的目标文件中,链接器不在乎。它从目标文件生成可执行文件,无论它们来自何处,并且在最终的可执行文件中,库/非库符号之间的所有区别都消失了。

至于目的,我可以想象某种专门的应用程序框架可以在库中具有 main,您以定义的函数的形式提供回调。

【讨论】:

  • SDL 执行此操作 - 它的 main 提供跨平台设置和拆卸代码。当用户在#includeing SDL 之后键入main 时,它实际上是一个扩展为SDL_main 的宏,当一切都正确初始化时,它从main 调用。这提供了另一个用例,尽管我已经看到对这种方法的大量批评。
  • @jaggedSpire,不知道这一点,但是是的,这也是一个原因。然而,在我看来,重新定义main 的宏是一个纯粹的邪恶。
  • 是的,那是我看到的主要批评(不是双关语),以前也让我很生气。幸运的是,它们允许您强制使用自己的入口点,但是当出现问题时,它会带来不太连贯的错误消息的缺点。真的很有趣。
猜你喜欢
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多