Visual Studio 编译的程序在尝试减小输出大小后无法正确初始化

Visual Studio compiled program doesn't initialize properly after trying to decrease output size

本文关键字:输出 初始化 编译 Studio 程序 Visual      更新时间:2023-10-16

我试图制作一个简单的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解决了问题。

argcargv的初始化是由C运行时执行的。使用/nodefaultlib选项,它们将被非原始化。您仍然可以使用GetCommandLineWCommandLineToArgvW自己检索命令行参数。

的确,没有解析参数,因为这是语言运行时库入口点的一部分,并且您使用/ENTRY链接器选项替换了自己的替换。

调用GetCommandLineWCommandLineToArgvW在Windows提供的DLL中找到的功能,以获取正常的argvargc值。