使用VS2015更改应用程序的入口点

时间:2018-12-16 00:32:06

标签: c++ visual-studio-2015 linker

我试图重新定义应用程序的入口点,使其不使用main(),因为它与我尝试测试的其他代码冲突。

我正在使用子系统:CONSOLE,并输出一个exe。定义为

时,一切正常
int main(int argc,CHAR  **argv) {}

一切正常。

然后我将其更改为。

int main_test(int argc,CHAR  **argv) {}

然后在Visual Studio链接器入口点中,将其从其空白值更改为main_test,我开始收到与libcpmtd.lib和其他obj文件中缺少的其他符号(如__stdio_common_vsscanf)相关的链接错误(如3500+)显然这是一个内置函数,实际上我并没有在任何地方调用。

Error   LNK2019 unresolved external symbol ___mb_cur_max_func referenced in function _Getcvt    MyProject C:\Source\project\src\libcpmtd.lib(xwctomb.obj)   1   

如果我将函数保留为上面所示的main,并且输入main作为入口点,则会得到完全相同的错误,因此使我相信我正在做的事情是错误的。任何帮助将不胜感激,似乎是一个简单的问题,我不确定为什么如此困难。

1 个答案:

答案 0 :(得分:1)

首先,您需要设置entry point

  

打开项目的“属性页”对话框。有关详细信息,请参见设置   Visual C ++项目属性。

     

单击链接器文件夹。

     

点击“高级”属性页面。

     

修改入口点属性。

并设置main_test

之后,我不完全理解为什么,但是有必要做this

  

打开项目的“属性页”对话框。有关详细信息,请参见设置   Visual C ++项目属性。

     

单击链接器文件夹。

     

点击输入属性页面。

     

修改“力符号参考”属性。

为x86设置_mainCRTStartup或为x64设置mainCRTStartup

或者用您的代码以编程方式完成:

#pragma comment(linker, "/ENTRY:main_test")
#if defined(_M_IX86)
# pragma comment(linker, "/INCLUDE:_mainCRTStartup")
#else
# pragma comment(linker, "/INCLUDE:mainCRTStartup")
#endif

#include <iostream>    

int main() {
   std::cout << "main" << std::endl;
   return 0;
}

int main_test()
{
   std::cout << "main_test" << std::endl;
   return 0;
}

输出

main_test

请注意,main不是默认的入口点。控制台应用程序的入口点是_mainCRTStartup,它调用main。因此,更改入口点会使您失去CRT,并且必须手动实现命令行参数获取之类的操作。有关更多详细信息,请查看here

UPD

我认为开发自己的CRT并不是一个好的决定,使用内置入口点之一会更容易。

#pragma comment(linker, "/ENTRY:wmainCRTStartup ") // wmain will be called
//#pragma comment(linker, "/ENTRY:mainCRTStartup  ") // main will be called

#include <iostream>
#include <stdlib.h>


int main(int argc, char** argv) {
   for (int i = 0; i < argc; i++)
      std::cout << argv[i] << std::endl;
   return 0;
}

int wmain(int argc, wchar_t *argv[])
{
   for (int i = 0; i < argc; i++)
      std::wcout << argv[i] << std::endl;
   return 0;
}