我试图制作一个简单的C 程序,并使用Visual Studio进行编译,并使用可显着降低其大小的选项。
代码是:
int main(int argc, char** argv)
{
return argc;
}
命令行是:
cl /O1 /GS- /Oi- test.cpp /link /nodefaultlib /safeseh:no /filealign:512 /entry:main /subsystem:console /MERGE:.rdata=.text
该程序在没有警告的情况下编译和链接。它运行,但没有返回参数的数量,而是从内存中返回随机数。
似乎问题是,堆未初始化,并且参数不会像通常在Windows程序的启动中一样被解析。我犯的错误是什么?
编辑:以下答案都是正确的,并且同时发布,所以我不接受,但是他们确实有帮助,并且通过将我的程序链接到kernel32.lib。shell32.lib解决了问题。
argc
和argv
的初始化是由C运行时执行的。使用/nodefaultlib
选项,它们将被非原始化。您仍然可以使用GetCommandLineW
和CommandLineToArgvW
自己检索命令行参数。
的确,没有解析参数,因为这是语言运行时库入口点的一部分,并且您使用/ENTRY
链接器选项替换了自己的替换。
调用GetCommandLineW
和CommandLineToArgvW
在Windows提供的DLL中找到的功能,以获取正常的argv
和argc
值。