今天要学习的内容是 命令行编译运行 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. SSAS部署失败方法总结

    最近在自学SSAS,从最简单的入手,却频频遇到问题,为了以后在学习过程中能更快的进行问题的定位,所以在此将遇到的问题以及解决方案进行记录 Q1:数据源"Adventure Works DW2 ...

  2. 2.10 破解密码这么简单,Linux是安全的操作系统吗?

    很多人看到系统修复模式这节内容时,都会有所感慨:Linux 的密码破解太容易了,这样的操作系统还安全吗?Linux 不是以安全性著称的吗? 图 1 密码安全 本节,我们结合图 1 解释一下类似的问题. ...

  3. rpmbuild命令RPM包制作kafka示例SPEC

    kafka的自定义安装路径RPM包制作 # 编写SPEC cat kafka.spec BuildArch: noarch Name: kafka_2.11 Version: 2.1.0 Releas ...

  4. 接口测试中Groovy引擎的接入实现!

    接口测试中Groovy可以作为上下游接口参数化传递的前置脚本和后置脚本使用,无缝衔接Java语法,groovy的引入对于动态参数化的设置方便很多. 其中核心部分就是接入groovy的引擎,下面介绍gr ...

  5. jmeter如何产生批量数据?

    在使用jmeter时,若需要产生批量数据,可以通过连接数据库--执行相关sql进行操作,例如添加20条数据 步骤: 1.添加jdbc 数据库配置信息 2.添加循环控制器(循环次数20) 3.循环控制器 ...

  6. 2023NOIP A层联测26 T3 tour

    2023NOIP A层联测26 T3 tour 有意思的树上主席树. 思路 首先考虑一个点 \(p\) 能计入答案的情况,就是 \(dis(x,p)-a_p \ge a_p\). 我们把 \(x \t ...

  7. Ubuntu 无法播放MP4

    今天用ubuntu打开mp4发现无法播放,然后我以为文件损坏了,就传到手机上面,发现还是可以播放的,然后就查了一下相关资料,发现有人让我安装这个 sudo snap install ffmpeg 安装 ...

  8. Abp vNext 入门到放弃系列

    文章目录 1.模块介绍 2.模块加载机制 3.依赖注入 4.AutoMapper-- 待定 5.本地化--待定 6.模型验证--待定 7.异常处理--待定 8.缓存 9.动态代理和拦截 10.分布式锁 ...

  9. elementUI中的级联选择器,默认赋值不起作用

    今天遇到再使用element的级联选择器功能的时候,是多选,默认赋值不起作用. 后来查到是因为少了multiple属性,但是multiple属性要放在props绑定的对象中,而不是直接放在标签上 &l ...

  10. Go操作数据库之MySQL

    安装mysql驱动: go get -u github.com/go-sql-driver/mysql 初始化模块 go mod init m 执行 go mod tidy 导入包: package ...