C语言与Java语言编译过程及文件类型

大家天天开心!

文章目录


前言

我现在对文件的一些类型是什么还是有点迷,包括对于C语言和Java语言我们在编译执行完成分别生成的什么文件还是印象不深,所以我想把这些一起总结一下。


提示:以下是本篇文章正文内容,下面案例可供参考

一、C语言编译过程和文件类型

完整编译过程:

源代码c----->预处理器------>预处理后.i------->编译器------->汇编代码.s--------->汇编器------>目标文件.obj/.o-------->链接器-------->可执行文件.exe

各阶段生成文件详解:
文件类型​​ ​​扩展名​​ ​​内容​​ ​​作用​​ ​​是否可删除​​

|-------|------------------------|----------|-------|----------|
| 源代码 | .c/.cpp | 人类可读代码 | 编程基础 | 保留 |
| 头文件 | .h | 函数声明/宏定义 | 代码复用 | 保留 |
| 预处理文件 | .i | 宏展开后的代码 | 调试用 | 可删除 |
| 汇编文件 | .s/.asm | 汇编指令 | 中间表示 | 可删除 |
| 目标文件 | .obj(Win)/.o(Unix) | 机器码(未连接) | 模块化编译 | 可删除 |
| 静态库 | .lib(Win)/.a(Unix) | 多个目标文件集合 | 代码复用 | 保留 |
| 动态链接库 | .dll(Win)/.so(Unix) | 可共享的机器码 | 运行时加载 | 保留 |
| 可执行文件 | .exe(Win)/无扩展名(Unix) | 完整机器码 | 直接运行 | 保留 |
| 调试信息 | .pdb(Win)/.dSYM(macOS) | 符号表/调试信息 | 调试用 | 可删除(发布时) |
| 数据文件 | .dat | 程序数据 | 存储数据 | 保留 |

编译过程详解:

(1)预处理阶段:

bash 复制代码
gcc -E main.c -o main.i

处理#include,#define等指令

删除注释

展开宏

(2)编译阶段 :

bash 复制代码
gcc -S main.i -o main.s

将C代码转为汇编代码

平台相关优化

(3)汇编阶段:

bash 复制代码
gcc -c main.s -o main.o

将汇编代码转为机器码

生成目标文件(.o)

(4)链接阶段

bash 复制代码
gcc main.o -o program

合并多个目标文件

链接库文件

生成可执行文件

库文件对比:
特性​​ ​​静态库 (.lib/.a)​​ ​​动态库 (.dll/.so)​​
​​链接时机​​ 编译时 运行时
​​文件大小​​ 较大(包含库代码) 较小(仅引用)
​​内存使用​​ 每个程序独立拷贝 共享内存
​​更新​​ 需重新编译 替换文件即可
​​依赖​​ 无运行时依赖 需库文件存在
​​示例​​ libmath.a math.dll

二、Java编译与执行过程

Java编译流程:

源代码.java ------->javac编译器 --------->字节码.class -------->JVM -------->机器码

Java文件类型讲解:

源代码 .java java代码 编程基础

字节代码 .class JVM指令 跨平台执行

归档文件 .jar 多个.class打包 分发程序

Web应用 .war Web应用打包 部署到服务器

企业应用 .ear 多个模块打包 J2EE应用

本地库 .dll/.so JNI本地代码 本地方法

配置文件 .properties 键值对配置 程序配置

序列化数据 .ser 对象序列化 对象持久化

Java生成EXE的原理

Java本身不直接生成原生EXE,但可以通过以下方式实现:

(1) 打包为可执行JAR
bash 复制代码
# 创建可执行JAR
jar cfe app.jar MainClass *.class

# 运行
java -jar app.jar
(2) 使用打包工具生成EXE

常用工具​​:

  • Launch4j:轻量级包装器

  • Excelsior JET:提前编译为本地代码

  • GraalVM Native Image:编译为本地可执行文件

三、C语言 vs Java编译对比

​​特性​​ ​​C语言​​ ​​Java​​
​​编译输出​​ 机器码 字节码
​​执行方式​​ 直接运行 JVM解释执行/JIT编译
​​跨平台​​ 需重新编译 字节码跨平台
​​依赖文件​​ .dll/.so JRE/JDK
​​编译速度​​ 较慢 较快
​​运行时性能​​ 高 中等(JIT优化后接近C)
​​内存管理​​ 手动 自动垃圾回收
​​典型文件​​ .c, .h, .obj, .exe .java, .class, .jar
​​调试文件​​ .pdb 无专用格式(JVM内置)

四、关键概念详解

1. .dat文件

  • ​​本质​​:通用数据文件(非特定格式)

  • ​​常见内容​​:

    • 二进制数据(如图像、音频)

    • 文本数据(CSV、自定义格式)

    • 程序配置

  • ​​生成方式​​:

bash 复制代码
// C语言创建.dat文件
FILE *fp = fopen("data.dat", "wb");
fwrite(buffer, sizeof(char), size, fp);
fclose(fp);

2. DLL(动态链接库)

优势​​:

  • 节省内存

  • 更新无需重新编译主程序

  • 模块化开发

3. Java字节码执行

五、实际项目文件结构示例

C语言项目:

myapp/

├── src/

│ ├── main.c

│ ├── utils.c

│ └── utils.h

├── lib/

│ └── thirdparty.lib

├── bin/

│ ├── myapp.exe

│ └── app.dll

└── data/

└── config.dat

Java项目:

myapp/

├── src/

│ └── com/

│ └── myapp/

│ ├── Main.java

│ └── Util.java

├── target/

│ ├── classes/

│ │ └── com/

│ │ └── myapp/

│ │ ├── Main.class

│ │ └── Util.class

│ └── myapp.jar

└── config/

└── app.properties


总结

  1. C语言编译​​:

    • 生成机器码

    • 产生中间文件(.i, .s, .o)

    • 最终输出平台相关可执行文件

  2. ​​Java编译​​:

    • 生成字节码(.class)

    • 依赖JVM执行

    • 通过打包工具可生成EXE

  3. ​​关键文件​​:

    • .dll/.so:共享库

    • .dat:通用数据文件

    • .jar:Java打包格式

    • .exe:Windows可执行文件

  4. ​​跨平台差异​​:

    • C:需为每个平台编译

    • Java:一次编译,到处运行(需JVM)

理解这些文件类型和编译过程,将帮助您更好地组织项目、调试程序,并选择适合的部署策略。

相关推荐
小师兄吃牛肉5 分钟前
SQL 编辑器异常排查:基于 KStudio 的一次实战记录
java·sql·编辑器
m0_587383007 分钟前
无人自助拼豆系统开发实战指南 核心功能架构搭建与落地经验分享
java·经验分享·spring·小程序·架构·需求分析
垆边人似月.8 分钟前
华为题:字符串中最长连续数字串
开发语言·c++·算法
从小白到软工8 分钟前
C语言(中)预告
c语言·数据结构·经验分享·ai编程
Wang's Blog11 分钟前
Java 项目实战: 交友项目 - Dubbo 超时与重试
java·dubbo·交友
(未雨绸缪)13 分钟前
VScode中AI补全功能开关
编辑器
星夜离尘5613 分钟前
MATLAB 清洗 CSV 采样日志:重复时间戳、无效行、分组统计与自动出图
开发语言·matlab·数据分析·数据清洗·csv
BD_Marathon14 分钟前
ChatPromptTemplate的高级特性
android·java·javascript
程序猿追19 分钟前
立方体转到九十度:用 kotlin-math 核对鸿蒙上的两种旋转
android·开发语言·kotlin
要开心吖ZSH21 分钟前
定时任务是用外部调度(xxl-job)还是本地化( @Scheduled)更香?以号源刷新任务为例?
java·xxl-job·定时任务·scheduled