我试图使用链接器开关" / entry"提供我自己的可视化c ++可执行文件的入口点。相关的Microsoft文档详细介绍了如何在dll中手动初始化c运行时,但我无法掌握如何在我的exe中初始化它。我得到的最好的是我需要调用_CRT_init,但我不知道这是一个函数还是一个宏,或者它可能被定义的地方,以及Visual Studio(和msbuild)是不是#39;识别标识符,所以没有提示。
这里的理由是,我尝试使用Google Test进行单元测试,这是一个可执行文件,并且由于main()冲突而无法链接。 GTest常见问题解答中提到的两种方法并不是很普遍,需要对大约30个遗留可执行文件进行大量修改才能实现。重命名每个单元测试应用程序的main()似乎是一种超级简单的方法,只要我能初始化c运行时。
答案 0 :(得分:0)
所以我今天下午搜索了C Runtime来源,答案是“不”。如果要使用C运行时,则无法提供自己的名为main
的可执行入口点。除了_CRT_INIT()
是dll的初始化函数(mainCRTStartup()
是可执行文件的初始化函数之一)之外,mainCRTStartup()
和它的名称一样调用main()
。 / p>
答案 1 :(得分:0)
要测试foo.cc文件,您需要编译并将其链接到您的单元 测试程序
这个方案的问题是什么?
答案 2 :(得分:0)
尽管没有特别说明,但可以用与在DLL中相同的方式在可执行文件中初始化CRT。
EXTERN_C BOOL WINAPI _CRT_INIT( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved );
// ThreadProc for CreateRemoteThread, a possible use case.
DWORD WINAPI ArbitraryAlternateEntryPoint( LPVOID )
{
_CRT_INIT( GetModuleHandle( NULL ), DLL_PROCESS_ATTACH, NULL );
// CRT functions can be used here.
_CRT_INIT( GetModuleHandle( NULL ), DLL_PROCESS_DETACH, NULL );
return 0;
}
documentation建议,除了初始调用外,还应为每个新线程调用_CRT_INIT,但是实际上这不是必需的。