2017-03-08 59 views
0

我正在尝试使用链接器开关“/ entry”为visual C++可执行文件提供自己的入口点。相关的Microsoft文档详细介绍了如何在dll中手动初始化c运行时,但我无法掌握如何在我的exe中初始化它。我得到的最好的结果是我需要调用_CRT_init,但我不知道这是一个函数还是一个宏,或者它可能定义的位置,并且Visual Studio(和msbuild)不能识别标识符,所以那里没有提示。如何在exe中手动初始化c运行时?

这里的基本原理是我试图用谷歌测试单元测试一个可执行文件,它不会链接,因为main()发生冲突。 GTest FAQ中提到的两种方法并不是很通用,需要大量的重做才能实现大约30个遗留可执行文件。重命名每个单元测试应用程序的main()似乎是一个超级简单的方法,只要我能初始化c运行时即可。

+1

Googletest不用于测试的可执行文件,它是用于测试 库。用于测试某个库的谷歌测试工具需要使用自己的可执行文件(具有自己的'main'功能)来执行此操作。 –

+0

显然,我试图通过链接或编译从A代码到GTest可执行文件B,而不是通过从B运行A或任何您认为我正在执行的代码来测试链接或编译为任意可执行文件A的代码。请参阅[link](https://github.com/google/googletest/blob/master/googletest/docs/FAQ.md#how-do-i-test-a-file-that-defines-main)描述我面对的问题。我非常感谢你对你不知道答案的问题发表评论,并告诉提问者他们不知道他们在谈论什么。 – tyotypic

+0

如果您可以访问运行时库的源代码,只是一个提示。 [MSDN](https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx)说,初始化代码应该是'libcmt.lib'。希望它有帮助... –

回答

0

所以我今天下午搜索了C运行时间源,答案是“否”。如果您想使用C运行时,则无法提供您自己的可执行入口点,该入口点未命名为main。除了_CRT_INIT()是一个dll的初始化函数(mainCRTStartup()是可执行文件的初始化函数之一),mainCRTStartup()及其类似名称的调用main()

0
  • 你可以在一个独立的包装模块中初始化CRT,它具有 main; obj1
  • 将所有现有的exe模块的主模块重命名为xx_main; OBJ2,OBJ3 .... objn
  • 链接OBJ1(主)(OBJ2,OBJ3 .... objn)

要测试一个foo.cc文件,你需要编译并将其链接到您的单位 测试程序

什么是这个方案的问题?

enter image description here

+0

这是GTest FAQ中的第一个建议,但更全球化。这里唯一真正的问题是你必须以某种方式排除y.obj被链接到单元测试exe。完全可能,但稍微挑剔。 – tyotypic

+0

这里y.c将是“单元测试exe”,而其他所有(x.c)将是其他模块haing main()。想法是让单元测试exe的代码初始化CRT就像任何其他exe文件,然后让所有其他“exe”模块链接到它.. –

+0

但xc可执行文件都需要自己的'main()',否则CRT可以在正常执行过程中不会被初始化。 – tyotypic