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

     2023-02-21     158

关键词:

【中文标题】从 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 生成。

标准输入 C++

...09【问题描述】:我需要将标准输入从in.txt输入到我的.exe文件,然后将输出推送到out.txt,如下所示:$a.exe&lt;in.txt&gt;out.txt我知道使用&gt;可以将std::cout的输出转发到文件,但我不知道如何从这样的文件中获取输入。【问... 查看详情

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

】从Subversion存储库中删除特定文件?【英文标题】:RemoveaspecificfilefromaSubversionrepository?【发布时间】:2010-11-1108:02:27【问题描述】:我有一个SVN存储库,其中包含Bin目录中的内容(.exe、.dll、.pdb)。我想清理存储库以删除这些... 查看详情

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

...虽然我的静态库运行良好,但我注意到默认设置带有以下文件:stdafx.hstdafx.cpptargetver.h我不希望这个库很大。我希望尽可能地最小化 查看详情

预编译标准库头文件 - C++

】预编译标准库头文件-C++【英文标题】:Precompilingstandardlibraryheaderfiles-C++【发布时间】:2009-11-1418:41:52【问题描述】:在我的项目中,不同的文件中使用了几个STL标头。我读到了,将所有这些头文件放在一个头文件中并在我的... 查看详情

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

...3.1/index.html安装了it++,一个C++信号处理库,方法是下载zip文件,进行cmake、make和makeinstall 查看详情

c++学习笔记:高级编程:文件和流,异常处理,动态内存,命名空间

C++文件和流到目前为止,我们已经使用了iostream标准库,它提供了cin和cout方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到C++中另一个标准库fstream,它定义了三... 查看详情

c++标准库和标准模板库

...的类库及库函数资源。C++标准库的内容总共在50个标准头文件中定义。在C++开发中,要尽可能地利用标准库完成。这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费时间、人力重新开发呢;(2)质量:标准库... 查看详情

如何正确包含来自 NVIDIA C++ 标准库的文件?

】如何正确包含来自NVIDIAC++标准库的文件?【英文标题】:HowdoIproperlyincludefilesfromtheNVIDIAC++standardlibrary?【发布时间】:2021-09-0513:30:52【问题描述】:我试图通过使用NVIDIA的C++标准库的version在CUDA中使用共享指针。所以试图包括&am... 查看详情

如何使用 C++ 代码运行 MFC 应用程序 exe 文件?

】如何使用C++代码运行MFC应用程序exe文件?【英文标题】:HowtorunaMFCapplicationexefilewithc++code?【发布时间】:2013-11-0419:48:54【问题描述】:我是MFC和C++的新手。给了我一个MFC应用程序,基本上我想要实现的是在另一个项目中从我的... 查看详情

从 Dev C++ 项目中删除文件

】从DevC++项目中删除文件【英文标题】:RemovefilefromDevC++project【发布时间】:2021-01-0423:34:24【问题描述】:我想从项目和项目浏览器中删除一些文件。我可以通过选择文件并取消选中复选框(“包含在编译中”和“包含在链接中... 查看详情

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

】从C++中的堆栈容器中删除自定义对象【英文标题】:DeletingcustomObjectfromStackcontainerinC++【发布时间】:2021-11-1004:22:29【问题描述】:我有一个标准的树节点,由3个指向它自己类型和字符值的对象的指针组成。我正在尝试使用标... 查看详情

有条件地包含 C++ 标准库

...能会出现这样一种情况,即对象A和B可能在同一个main.cpp文件中使用,这可能会导致头文件冲突并且头文件可能会被编译两次。如何防止被编译两次?我试过使用:#ifnde 查看详情

如何从库标准错误中读取?

】如何从库标准错误中读取?【英文标题】:Howtoreadfromalibrarystandarderror?【发布时间】:2012-02-0807:48:17【问题描述】:我有一个使用C++库的Qt/C++应用程序。这个库有一个日志机制,可以将字符串消息写入标准错误。现在,我希望... 查看详情

从c++标准库指针萃取器谈一下traits技法(代码片段)

本篇文章基于gcc中标准库源码剖析一下标准库中的模板类pointer_traits,并且以此为例理解一下traits技法。说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。还是先看一下思维导图,如下:1.指... 查看详情

标准库特殊设施c++(代码片段)

第17章标准库特殊设施如果你已经从第一章按部就班的学到了第17章,我相信你所认识的C++知识已经超过了很多人,因为有学习的同学并没有耐心慢慢全面地学完C++11的全部知识,从17章标准库特殊设施以及... 查看详情

标准库特殊设施c++(代码片段)

第17章标准库特殊设施如果你已经从第一章按部就班的学到了第17章,我相信你所认识的C++知识已经超过了很多人,因为有学习的同学并没有耐心慢慢全面地学完C++11的全部知识,从17章标准库特殊设施以及... 查看详情

为啥 C++ 标准库中没有线程池?

】为啥C++标准库中没有线程池?【英文标题】:WhyistherenothreadpoolinC++standardlibrary?为什么C++标准库中没有线程池?【发布时间】:2021-11-1010:59:15【问题描述】:自C++11以来,C++中并行/并发编程工具的数量激增:线程、异步函数、... 查看详情

c++从入狱到入坟:文件和流,高级程序员必备核心知识,收藏即可学会(代码片段)

C++ 文件和流到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。本文介绍如何从文件读取流和向文件写入流。这就需要用到C++中另一... 查看详情