今天要学习的内容是 命令行编译运行 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
  1. 编译结果验证

7.1 基本检查

# 检查可执行权限
ls -l hello # 文件类型检查
file hello # 查看依赖库
ldd hello

这些是命令行编译 C 语言程序的核心概念和基本操作。根据具体需求,可以组合使用不同的 「编译选项」


二、实操体验

接下来,让我们系统看一下在 WSL 中编译运行 C 语言程序的可行性和具体实施方法。

1. 基础环境分析

1.1 WSL 的优势

  • 提供完整的 Linux 环境
  • 支持标准的 GNU 工具链
  • 与 Windows 完美集成
  • 性能接近原生 Linux

1.2 必要组件

  • GCC 编译器
  • Make 工具(可选)
  • 文本编辑器
  • 调试工具(可选)
  1. 环境搭建步骤

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 语言程序的完整流程的更多相关文章

  1. 终端命令行编译运行C#程序HelloWorld

    终端命令行编译运行C#程序HelloWorld 今天忽然有人问我,刚学习java程序的时候,一般老师都会建议我们从配置环境变量开始从命令行编译运行程序,那么学习c#的时候基本是直接安装visual s ...

  2. 命令行编译运行Java

    首先要安装JDK,然后设置环境变量Path,添加C:\Program Files (x86)\Java\jdk1.8.0_66\bin 然后建立一个名为j.java的文件,里面加入如下代码: publ ...

  3. 【linux基础】使用命令行编译运行c++程序

    前言 在linux系统运行程序,小鹅知道的有3种编译方式,一种是直接命令行编译,一种是使用Cmake,一种是使用脚本文件(*.sh).本文介绍的是使用命令行编译. 使用过程 注意不同系统的编译器版本可 ...

  4. java命令行编译运行、打包jar

    过程:java文件→class文件→exe执行文件 --------------------------------------------- 一.编译:从.java生成.class   (1)ecl ...

  5. 如何使用命令行直接运行PHP脚本程序

    在我的博客里有一些文章是和解码或者处理文件有关,其中有些自动化工作比较简单,使用了一些PHP程序来编写处理,这样写起程序来也比较快,因为是纯过程的任务,不想用C#来处理. 写完PHP的脚本程序后,保存 ...

  6. Windows下使用MinGW在命令行编译运行C++程序

    之前学习C语言的时候都是用IDE类似CodeBlocks的工具写完直接编译运行的,今天突然心血来潮,自己下一个编译器,在命令行下,编译运行C++程序,了解一下编译过程. 一.安装编译器 首先你需要下载 ...

  7. (转)JAVA路径问题及命令行编译运行基础(linux下)

    原地址: http://blog.csdn.net/biaobiaoqi/article/details/6846274 java的运行机制的基本概念: 源文件 也就是我们熟知的.java文件. 类文 ...

  8. [C语言]在命令行编译执行程序

    ----------------------------------------------------------------------------------------- [开始] 1. 在M ...

  9. java 命令行 编译 运行程序

    学习java使用IDE前最好先用用命令行的javac.java来跑一跑简单的程序,这样能够熟悉一下包管理对.class文件路径的影响. 我们先写一段简单的代码: package com.csdn.lk ...

  10. Matlab命令行编译运行HelloWorld

    Matlab安装完成后用记事本写一个文件HelloWorld.m内容如下: function HelloWorld() disp('Hello,World!'); end 保存后在命令行中切到Hell ...

随机推荐

  1. 解密prompt系列41. GraphRAG真的是Silver Bullet?

    这一章我们介绍GraphRAG范式,算着时间也是该到图谱了,NLP每一轮新模型出来后,往往都是先研究微调,然后各种预训练方案,接着琢磨数据,各种主动学习半监督,弱监督,无监督,再之后就到图谱和对抗学习 ...

  2. 【分享】用typescript结合react编写代码,引入第三方库模块报错的解决办法

    1.前提 我用  npx create-react-app my-react-ts-app --template typescript  创建了一个应用,加了typescript到项目中; 问题来了, ...

  3. 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!

    前言 程序员的终极追求是什么?当系统流量大增,用户体验却丝滑依旧?没错!然而,在大量文件传输.数据传递的场景中,传统的"数据搬运"却拖慢了性能.为了解决这一痛点,Linux 推出了 ...

  4. Air780E篇:采集温湿度传感器数据,并网页查看

    ​ 今天我们学习合宙低功耗4G模组Air780E篇:采集温湿度传感器数据并实现网页查看,以下进入正文. 一.硬件装备 1.1 硬件连接 使用跳线帽将IO_SEL连接3.3V,给引脚供3.3V的电.dh ...

  5. 【FAQ】HarmonyOS SDK 闭源开放能力 —Share Kit

    1.问题描述: 使用系统分享组件分享本地文件,点击分享菜单下方的"另存为" 将要分享的文件分享至系统文件管理中,在文件管理中查看分享进来的文件为0B.尝试了3种uri的写法都不行, ...

  6. dephi winspy Demo

    在spy+中未找到这样的功能 有个隐藏窗口的进程,相让窗口显示出来,虽然可以找到进程ID,然后再逐步找到主窗口句柄,但又没句柄发各种消息的软件. 计得以前有个窗口精灵之类的,网上找了很多,要么没有此功 ...

  7. 不依赖 Spring,你会如何自实现 RabbitMQ 消息的消费(一)

    开心一刻 上午一好哥们微信我哥们:哥们在干嘛,晚上出来吃饭我:就我俩吗哥们:对啊我:那多没意思,我叫俩女的出来哥们:好啊,哈哈哈晚上吃完饭到家后,我给哥们发消息我:今天吃的真开心,下次继续哥们:开心尼 ...

  8. core-js版本过低,需要更新但是更新失败的原因

    ore-js@2.6.12: core-js@.3 is no longer maintained and not recommended for usage due to the number of ...

  9. vue-element-admin 左侧的导航栏固定展开

    项目需要把左侧的导航栏固定打开,不关闭我们只需要打开store-modules-app.js文件中,把下面的代码给修改就可以了

  10. 敏捷开发:Sprint Planning 冲刺计划会议详细介绍和用户故事拆分、开发任务细分

    Sprint Planning 冲刺计划会议简介 Sprint Planning (冲刺计划会议),又叫规划会议.此会议通过 Scrum 团队的集体沟通讨论,确定接下来的 Sprint 中要完成的待开 ...