c++ - 使用 VS2015 更改应用程序的入口点
问题描述
我正在尝试重新定义我的应用程序的入口点以不使用 main(),因为它与我正在尝试测试的其他一些代码发生冲突。
我正在使用一个子系统:CONSOLE,并输出一个 exe。当它被定义为
int main(int argc,CHAR **argv) {}
事情编译得很好。
然后我将其更改为。
int main_test(int argc,CHAR **argv) {}
在 Visual Studio Linker 入口点中,我将其从空白值更改为 main_test 我开始收到大量(如 3500+)与 libcpmtd.lib 和我的 obj 文件中缺少的其他符号(如 __stdio_common_vsscanf)相关的链接错误,这显然是我实际上并没有在任何地方调用的内置函数。
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 作为入口点,所以它让我相信我做的事情是错误的。任何帮助将不胜感激,这似乎是一个简单的问题,我不知道为什么这么难。
解决方案
首先你需要设置入口点
打开项目的属性页对话框。有关详细信息,请参阅设置 Visual C++ 项目属性。
单击链接器文件夹。
单击高级属性页。
修改入口点属性。
并设置main_test
之后,我不完全明白为什么,但有必要这样做
打开项目的属性页对话框。有关详细信息,请参阅设置 Visual C++ 项目属性。
单击链接器文件夹。
单击输入属性页。
修改强制符号引用属性。
并设置_mainCRTStartup
为 x86 或mainCRTStartup
x64。
或者在你的代码中以编程方式进行:
#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 的入口点,您必须手动实现命令行参数获取等操作。更详细的看这里
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;
}
推荐阅读
- scala - 数据重叠 - Spark Scala
- c# - 使用 AutoMapper 处理属性更改的实体框架,外键关系丢失
- linux - 使用 settype 而不是 setname 搜索 ipset
- c# - 关于数据包和代理 Winpcap WPE Pro
- html - 选择下拉菜单在 Microsoft Edge 浏览器中不起作用
- javascript - Angular2如何切换网络摄像头
- javascript - 如何将嵌套的 JSON 数据结构简化为地图 JavaScript
- javascript - 在 Tree map d3.js 中解析 json 以获得不同的颜色
- docker - 如何限制 docker 容器内存使用
- jmeter - 如何在 Jmeter 中上传 .zip 文件?