Visual Studio 编译的程序在尝试减小输出大小后无法正确初始化
Visual Studio compiled program doesn't initialize properly after trying to decrease output size
我试图制作一个简单的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
值。
相关文章:
- 为什么两种不同的对象初始化方式给出不同的输出
- C++ - 输出与初始化变量不同?
- 如何使用函数的输出初始化 const 数组结构字段?
- 在MSDOS编译器上,用大于最大值的值初始化int时输出混乱
- SRAND 不会每次都初始化新输出
- 如何初始化文件中的文本并将其传递给类数组,以便在c++中输出
- 如何初始化可以设置为默认数组并将输入/输出作为数组的类函数?
- 从未初始化的 C++ 指针仍输出为已初始化
- 不正确的输出和变量未用Eclipse CDT初始化构造函数
- Visual Studio 编译的程序在尝试减小输出大小后无法正确初始化
- 初始化时 num 的哪个值会给这个嵌套循环一个"true"输出?
- C 在代码中初始化字符串变量时无控制台输出
- 初始化类函数,但输出仍为 0
- 初始化,然后单行输出
- 在Rcpp中初始化NumericMatrix类成员后未收到的输出
- C++:Xcode中未初始化的变量输出为0
- 动态初始化的 2D 数组输出错误
- 如何初始化指向输出缓冲区长度的指针
- -858993460输出一个未初始化的变量
- 为什么我得到这种输出,因为我知道数组中未初始化的整数元素的默认值是0