【C语言学习】——命令行编译运行 C 语言程序的完整流程
今天要学习的内容是 命令行编译运行 C 语言程序,进一步理解C语言编译运行的底层实现和编译原理相关知识,下面是命令行编译运行 C 语言程序的完整流程
一、理论讲解
1. 编译原理概述
1.1 编译过程的四个主要阶段
源代码 (.c) → 预处理 → 编译 → 汇编 → 链接 → 可执行文件
1.2 各阶段功能
- 预处理:展开宏、处理条件编译、包含头文件
- 编译:将 C 代码转换为汇编代码
- 汇编:将汇编代码转换为目标文件
- 链接:将目标文件与库文件链接生成可执行文件
2. 基本命令解析
2.1 gcc 基础编译命令
gcc [选项] 源文件 [-o 输出文件]
2.2 常用编译选项解析
-E # 仅预处理
-S # 编译到汇编代码
-c # 编译到目标文件
-o # 指定输出文件名
-Wall # 显示所有警告信息
-g # 包含调试信息
-O # 优化级别(O1,O2,O3)
3. 实践步骤示例
3.1 单文件编译
# 创建源文件
vim hello.c
# 基本编译(生成 a.out)
gcc hello.c
# 指定输出文件名
gcc hello.c -o hello
# 运行程序
./hello
3.2 分步编译示例
# 预处理
gcc -E hello.c -o hello.i
# 生成汇编代码
gcc -S hello.c -o hello.s
# 生成目标文件
gcc -c hello.c -o hello.o
# 链接生成可执行文件
gcc hello.o -o hello
4. 多文件编译
4.1 基本结构
project/
├── main.c
├── func.c
└── func.h
4.2 编译命令
# 一次性编译
gcc main.c func.c -o program
# 分步编译
gcc -c main.c -o main.o
gcc -c func.c -o func.o
gcc main.o func.o -o program
5. 实用编译选项组合
5.1 开发调试版本
gcc -Wall -g source.c -o debug_version
5.2 发布优化版本
gcc -O2 -Wall source.c -o release_version
6. 常见错误处理
6.1 编译错误类型
- 语法错误
- 链接错误
- 警告信息
6.2 排错命令
# 显示详细警告
gcc -Wall -Wextra source.c
# 生成调试信息
gcc -g source.c -o debug_version
- 编译结果验证
7.1 基本检查
# 检查可执行权限
ls -l hello
# 文件类型检查
file hello
# 查看依赖库
ldd hello
这些是命令行编译 C 语言程序的核心概念和基本操作。根据具体需求,可以组合使用不同的 「编译选项」。
二、实操体验
接下来,让我们系统看一下在 WSL 中编译运行 C 语言程序的可行性和具体实施方法。
1. 基础环境分析
1.1 WSL 的优势
- 提供完整的 Linux 环境
- 支持标准的 GNU 工具链
- 与 Windows 完美集成
- 性能接近原生 Linux
1.2 必要组件
- GCC 编译器
- Make 工具(可选)
- 文本编辑器
- 调试工具(可选)
- 环境搭建步骤
2.1 安装编译工具
# 更新包管理器
sudo apt update
# 安装编译工具链
sudo apt install build-essential
# 验证安装
gcc --version
2.2 安装辅助工具
# 安装调试器
sudo apt install gdb
# 安装 Make 工具
sudo apt install make
3. 实践示例
3.1 创建并编译简单程序
# 创建测试文件
echo '#include <stdio.h>
int main() {
printf("Hello from WSL!\n");
return 0;
}' > hello.c
# 编译程序
gcc hello.c -o hello
# 运行程序
./hello
编译+运行结果
输出:Hello from WSL!
3.2 使用 Make 构建(进阶)
# Makefile 示例
CC=gcc
CFLAGS=-Wall
hello: hello.c
$(CC) $(CFLAGS) hello.c -o hello
4. 开发工作流建议
4.1 基础工作流
- 使用 Windows 编辑器编写代码
- 通过 WSL 终端编译运行
- 在 WSL 环境中调试
4.2 集成开发环境
- VSCode + WSL 扩展
- CLion + WSL 配置
- 远程开发模式
5. 性能考虑
5.1 优势
- 接近原生 Linux 性能
- 完整的工具链支持
- 良好的文件系统集成
5.2 注意事项
- 跨文件系统访问可能影响性能
- 建议将项目文件存放在 WSL 文件系统中
- 注意内存和磁盘空间管理
综上所述,WSL 完全支持 C 语言程序的编译和运行,且提供了接近原生 Linux 的开发体验。
【C语言学习】——命令行编译运行 C 语言程序的完整流程的更多相关文章
- 终端命令行编译运行C#程序HelloWorld
终端命令行编译运行C#程序HelloWorld 今天忽然有人问我,刚学习java程序的时候,一般老师都会建议我们从配置环境变量开始从命令行编译运行程序,那么学习c#的时候基本是直接安装visual s ...
- 命令行编译运行Java
首先要安装JDK,然后设置环境变量Path,添加C:\Program Files (x86)\Java\jdk1.8.0_66\bin 然后建立一个名为j.java的文件,里面加入如下代码: publ ...
- 【linux基础】使用命令行编译运行c++程序
前言 在linux系统运行程序,小鹅知道的有3种编译方式,一种是直接命令行编译,一种是使用Cmake,一种是使用脚本文件(*.sh).本文介绍的是使用命令行编译. 使用过程 注意不同系统的编译器版本可 ...
- java命令行编译运行、打包jar
过程:java文件→class文件→exe执行文件 --------------------------------------------- 一.编译:从.java生成.class (1)ecl ...
- 如何使用命令行直接运行PHP脚本程序
在我的博客里有一些文章是和解码或者处理文件有关,其中有些自动化工作比较简单,使用了一些PHP程序来编写处理,这样写起程序来也比较快,因为是纯过程的任务,不想用C#来处理. 写完PHP的脚本程序后,保存 ...
- Windows下使用MinGW在命令行编译运行C++程序
之前学习C语言的时候都是用IDE类似CodeBlocks的工具写完直接编译运行的,今天突然心血来潮,自己下一个编译器,在命令行下,编译运行C++程序,了解一下编译过程. 一.安装编译器 首先你需要下载 ...
- (转)JAVA路径问题及命令行编译运行基础(linux下)
原地址: http://blog.csdn.net/biaobiaoqi/article/details/6846274 java的运行机制的基本概念: 源文件 也就是我们熟知的.java文件. 类文 ...
- [C语言]在命令行编译执行程序
----------------------------------------------------------------------------------------- [开始] 1. 在M ...
- java 命令行 编译 运行程序
学习java使用IDE前最好先用用命令行的javac.java来跑一跑简单的程序,这样能够熟悉一下包管理对.class文件路径的影响. 我们先写一段简单的代码: package com.csdn.lk ...
- Matlab命令行编译运行HelloWorld
Matlab安装完成后用记事本写一个文件HelloWorld.m内容如下: function HelloWorld() disp('Hello,World!'); end 保存后在命令行中切到Hell ...
随机推荐
- React h5架构
目录 目录 初始化项目架构 React h5架构 工具 技术栈 搭建流程 一.Vite构建项目 二.添加 git 三.运行项目 四.配置 Eslint 校验代码 五.配置 Prettier 格式化代码 ...
- Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏
前文: 模拟器运行环境及Lua代码--使用遗传进化算法(neat算法)玩超级玛丽游戏 lua语言实现的neat算法代码: -- MarI/O by SethBling -- Feel free to ...
- Verilog代码规范
历史修改信息 版本 更改描述 更改人 批准人 修订日期/生效日期 A01 发布首版 ldy 一.目的 作为我司verilog开发过程中的输入文件,用于统一FPGA开发人员的代码风格.从而在满足功能和性 ...
- LVM 使用与扩容总结
转载请注明出处: LVM(Logical Volume Manager,逻辑卷管理器)是一个用于Linux系统的磁盘管理工具.它提供了一种更加灵活的存储管理机制,可以方便地进行磁盘的扩容.缩减.快照以 ...
- SAM4MLLM:结合多模态大型语言模型和SAM实现高精度引用表达分割 | ECCV'24
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: SAM4MLLM: Enhance Multi-Modal Large Language Model for Referring Expres ...
- 源码开放:WebSocket应用示例
1 WebSocket概述 WebSocket是HTML5下一种新的协议(本质上是一个基于TCP的协议),它实现了浏览器与服务器之间的全双工通信,能够节省服务器资源和带宽,达到实时通讯的目的.WebS ...
- 记一次 .NET某hdp智能柜系统 卡死分析
一:背景 1. 讲故事 停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下: 被狗咬了 也不知道是不是出门没看黄历,在小区门口店里买烟,被 ...
- uni-app项目button组件去不掉的灰色边框爬坑
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app. 坑位 最近在开发个人 ...
- uni-app中使用svg
标签: svg js uni-app 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni- ...
- 协议Fuzz技术
文章一开始发表在微信公众号 https://mp.weixin.qq.com/s?__biz=MzUyNzc4Mzk3MQ==&mid=2247486230&idx=1&sn= ...
