- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Windows 8.1 64 位上使用 Dev-C++,它使用 GCC 编译。
我注意到我所有的 .c 文件总是被编译成至少 128 KB 的 .exe 文件,无论源代码有多小。即使是一个简单的“你好,世界!”是128kb。正如我所料,包含更多代码行的源文件增加了可执行文件的大小,但所有文件开始时至少有 128kb,好像这是某种最小大小。
我知道 .exe 实际上没有这样的最小大小; .kkrieger是一个完整的第一人称射击游戏,具有 3D 图形和声音,所有这些都适合一个 96kb 的可执行文件。
为了弄清楚这个问题,我在 Notepad++ 中打开了我的 hello_world.exe。我想,也许我的编译器添加了一个长头文件,恰好是 128kb。
不幸的是,我对可执行文件的了解还不够多,无法理解它,尽管我确实发现了诸如“地址 %p 没有图像部分 VirtualQuery 在地址 %p 的 %d 个字节失败”之类的字符串.exe 中常见的乱码。
当然,这不是一个严重的问题,但我想知道为什么会这样。
为什么会出现这个 128kb 的最小值?这是否与我的 64 位操作系统有关,或者可能与我的编译器的怪癖有关?
最佳答案
简短回答:视情况而定。
长答案:这取决于您拥有的操作系统及其处理可执行文件的方式。
大多数(如果不是全部)编程语言编译器不会将其分解为绝对的、原始的 x86/ARM/其他架构的机器代码。相反,在他们将您的源代码打包到 .o(目标)文件后,他们将 .o 及其库“链接”在一起,以形成标准的可执行格式。这些“可执行格式”本质上是特定于系统的文件格式,其中包含低级、非常接近机器代码的指令,操作系统以这种方式解释这些指令,以便将这些低级指令以以下形式中继到 CPU机器代码指令。
例如,我将讨论 Linux 设备最常用的两种可执行文件格式:ELF 和 ELF64(我会让您自己弄清楚它们的同名区别是什么)。 ELF代表可执行和可链接格式。在每个 ELF 编译的程序中,文件都以一个 4 字节的“魔数(Magic Number)”开头,它只是一个十六进制的 0x7F,后跟 ASCII 字符串“ELF”。下一个字节设置为 1 或 2,分别表示该程序适用于 32 位或 64 位体系结构。在那之后,另一个字节表示程序的 endianness.之后,还有几个字节说明架构是什么,依此类推,直到 64 位 header 总共达到 64 个字节。
但是,64 字节甚至不接近您所说的 128K。那是因为(除了 Windows .exe 格式通常要复杂得多这一事实之外),这里有 C++ 标准库的问题。例如,让我们看一下 C++ iostream
库的常见用法:
#include <iostream>
int main()
{
std::cout<<"Hello, World!"<<std::endl;
return 0;
}
此程序可能会在 Windows 系统上编译为一个非常大的可执行文件,因为当您将 iostream
添加到您的程序时,它会将整个 C++ 标准库添加到其中,从而极大地增加您的可执行文件的大小。
那么,我们该如何解决这个问题呢?简单的:使用 C++ 的 C 标准库实现!
#include <cstdio>
int main()
{
printf("Hello, World!\n");
return 0;
}
只需使用原始的 C 标准库即可将您的大小从几百 KB 减少到最多几千字节。发生这种情况的原因很简单,因为 GCC/G++ 出于某种奇怪的原因真的很喜欢将程序与整个标准 C++ 库链接。
但是,有时您绝对需要使用特定于 C++ 的库。在那种情况下,许多链接器都有某种命令行选项,这些选项基本上告诉链接器“嘿,我只使用 STDCPP 库中的 2 个函数,你不需要全部”。在 Linux 链接器 ld
上,这是命令行选项 -nodefaultlibs
。不过,我不完全确定这在 Windows 上是什么。当然,这可以很快中断大量调用,以及在进行大量标准 C++ 调用的程序中进行的此类调用。
所以,最后,我更担心的是简单地重写您的程序以使用常规 C 函数而不是新奇的 C++ 函数,尽管它们很神奇。如果您担心尺寸。
关于c - 即使是最小的 .c 文件也总是编译成至少 128 KB 的可执行文件,这是有原因的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34757747/
所以问题是:如何使用标准 C 库以跨平台方式实现简单的自检可执行文件? 在这里,我正在寻找技术,而不是特定的检查方法(如 CRC 或哈希码),但该技术可能包含更适合某些方法的元素(例如见下文)。 目的
我想构建一个 C++ 可执行文件,以便所有库也附加到可执行文件。构建这样一个可执行文件的方法是什么?因此,每当我在其他 PC(运行 Ubuntu)上使用 g++ 编译我的代码时,它不需要运行该可执行文
我在 Netbeans IDE 8.0.1 中编写了一个名为 SampleChat 的 Java GUI 程序,并使用“clean and build”功能创建了一个 jar 文件。 我进入 Netb
我有两个 DLL,一个用 native C++ 编写,另一个用 C++/CLI 编写。前者被注入(inject)到进程中,并在稍后的时间点加载后者。在调试时,我注意到 native DLL 的断点运行
如何访问可执行文件的机器代码(二进制文件)? 详情 我使用的是 Ubuntu (Linux) 我想访问 .exe 文件(文件遵循 PE 格式)的机器代码(二进制文件) 我正在使用 C 来实现 最佳答案
这个问题在这里已经有了答案: Run java jar file on a server as background process (4 个回答) 关闭1年前. 我正在使用命令提示符运行一个可执行
我的 jar 没有运行,我可以告诉它尝试运行,因为 log4j 文件设法创建日志文件夹,但没有任何 react 并且日志为空白。 我的问题是我在名为 bin 的文件夹中有 jar 文件,在名为 lib
我正在为我教育第一学期的编程考试创建一个程序。它应该向用户显示哥本哈根和其他 6 个城市(在其他时区)的时间。用户还应该能够将城市添加到列表中。我正在用 JAVA 编写程序(下面提供源代码)。当我从
我正在查看雅虎的 YUI 压缩器可执行 jar,他们有这个类,从 list 文件链接为“主类”: package com.yahoo.platform.yui.compressor; import j
问题是:从 Eclipse 导出时可执行 jar 中包含什么?我问这个问题是因为我想知道,例如,如果我在项目根目录中有一个图像,该图像是否会包含在导出中? 澄清:我说的是可运行的 jar 文件(已编辑
我知道这个问题已经被问了很多,并且我已经尝试了 eclipse(Kepler、Ganymede、Galileo)、fatJar、netbeans、blueJ、命令行和手册中的大约 20-30 种不同的
我从 IntelliJ 14.03 中的一个工件构建了一个 .jar。当我尝试在 JRE 中打开它时,没有任何反应。这只是一个简单的 GUI。 提前致谢。 最佳答案 在jar位置运行命令,例如 jav
我使用 eclipse 创建了一个可执行 JAR 文件。我在项目文件夹中有资源当框架打开时不会出现。我的意思是当我双击 JAR 文件时。更多的所以,在我尝试删除 JAR 文件后,我收到一条警告,表明该
我创建了一个尺寸相当大(125,000 kb)的可运行 Jar 文件。当我运行它时,该 jar 文件内的应用程序不会显示,但在任务管理器中 javaw.exe(应链接到该 jar 文件)进程正在运行。
我已经使用 Eclipse(文件->导出)为我的 java 程序创建了一个可执行 jar 文件。 当我双击 jar 时,它工作正常。将 jar 文件复制到另一台计算机(Windows)后,我收到错误“
我用 eclipse indigo 创建了一个可执行的 jar 文件,但是当我双击它时什么也没有发生。但是当我将 java -jar c:/dir/filename.jar 写入 cmd 时,它可以工
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
如何让该 Java 代码在 Eclipse 之外运行? import java.util.*; public class Calculations { public static void main(
今天我第一次启动 jar 文件时遇到问题。现在我知道(解压 jar 后)当我在 Eclipse 中导出并创建程序的 jar 包时,文本文件并没有出现。 为什么文本文件没有与类文件一起出现?我应该将它们
我不知道为什么,但是当我将项目导出到可执行 jar 文件时,有些东西并不像从 eclipse 运行程序一样。一帧不会打开,其中只包含文本。我有另一个内部框架,它是一个分割 Pane ,包含右侧面板上的
我是一名优秀的程序员,十分优秀!