我试图制作一个简单的 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
自行检索命令行参数。
关于c++ - 尝试减小输出大小后,Visual Studio 编译程序无法正确初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43822003/