从 exe 文件中删除标准 C++ 库

Posted

技术标签:

【中文标题】从 exe 文件中删除标准 C++ 库【英文标题】:Remove standard C++ library from exe file 【发布时间】:2017-06-11 00:00:01 【问题描述】:

我正在使用 Mingw 并尝试从我的 exe 文件中删除标准库的代码 - g++ -nostdlib -o main.exe main.cpp -luser32 。是的,它可以工作,但第一个函数总是成为入口点。好的,我只需要直接设置入口符号-g++ -nostdlib -e WinMain -o main.exe main.cpp -luser32。现在我得到“警告:找不到入口符号 WinMain;默认为 00401000”。在此之后,第一个函数再次成为入口点。然后,我尝试将 nostdlib 更改为 nodefaultlibs 并收到很多关于“未定义对'某些对象'的引用”的错误消息。

问题:那么,如何删除标准库代码并设置程序入口点?

PS g++ --version - g++(i686-posix-dwarf-rev0,由 MinGW-W64 项目构建)5.3.0。 main.cpp:

#include<windows.h>

//this function called instead of WinMain
int OtherFunction()

    MessageBoxA(NULL,"OtherFunction","OtherFunction",MB_OK);
    return 0;


int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

    MessageBoxA(NULL,"WinMain","WinMain",MB_OK);
    return 0;

【问题讨论】:

只是出于好奇,您为什么要尝试从可执行文件中删除标准库? 是的有点不寻常,想要删除标准库。不确定,但您可能需要将 WinMain 声明为 extern "C",否则如果您将其编译为 c++,则 WinMain 函数的链接器符号会被修饰,因此不是“WinMain”。或者您应该在链接器命令中使用(编译器特定的)修饰名称。如果您不知道这一切意味着什么,请使用寻找C++ 名称修饰 的知名搜索引擎。或参考例如geeksforgeeks.org/extern-c-in-c 但我不确定这是否非常权威。但这可能是准确的,不确定。 HTH,巴尼。 barny:我已经尝试过 extern "C" 和 -e WinMain@16。它也不起作用。 Borgleader:用于更多小型 exe 文件。如果我使用 nostdlib,我会得到 3kb 的 exe 文件。如果我不使用 nostdlib,我会得到 16 kb。如果我使用单个 push_back(1),我得到 68kb。我有点烦人。 【参考方案1】:

试试这样的:

extern "C" void WinMain()

  // Code here
  ExitProcess(0);

并与-e _WinMain链接

【讨论】:

警告:通过链接到 _WinMain@16 来解析 _WinMain... 但它有效!谢谢。 @Aso @16 可能是因为您将默认调用约定设置为 stdcall?无论哪种方式,当您不使用 CRT 时,您的 WinMain 函数的参数为​​零,而不是四个。这四个参数由 CRT 生成。

以上是关于从 exe 文件中删除标准 C++ 库的主要内容,如果未能解决你的问题,请参考以下文章

从 Subversion 存储库中删除特定文件?

是否应该从 C++ 中的静态库项目中删除 stdafx.h/.cpp? [关闭]

如何在 Ubuntu 中删除已安装的 C++ 库? [复制]

c++泛型算法

从 C++ 中的堆栈容器中删除自定义对象

C++小技巧