今天要学习的内容是 命令行编译运行 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. SSIS连接Excel2007版本之后的数据源

    今天我发现了新大陆,兴奋得不得了,由于原文写得太过详细与专业,我就偷偷懒直接Copy过来了,怕自己以后没地儿找,哈哈哈 原文链接:https://www.cnblogs.com/biwork/p/34 ...

  2. 5道大厂的JAVA经典面试题

    前言 本来想着给自己放松一下,刷刷博客,慕然回首,Java的四种引用,强弱软虚?泛型常用特点?Java创建对象有几种方式? 有没有可能两个不相等的对象有相同的hashcode?深拷贝和浅拷贝的区别是什 ...

  3. 管理 Python 环境和依赖关系的工具 venv、virtualenv、pipenv 、poetry 、 miniforge 和 anaconda 的区别

    管理 Python 环境和依赖关系的工具 venv.virtualenv.pipenv .poetry . miniforge 和 anaconda 的区别 venv.virtualenv.pipen ...

  4. CSP2023 游寄

    CSP2023 游寄 没错,又寄. day -n 停课集训,天天打联测模拟赛,人麻了. day -n 请假回家了,人更麻了. 和姐姐拥抱了. 差点睡过头,天天下大雨,悲. 我妈和亲戚出去了,和哥在家通 ...

  5. 【Linux Ops】如何无痛升级 glibc

    [环境]kos5.8sp2, kernel5.10 最近工作中需要搭建一个软件环境,其依赖的 glibc 版本较高,因此在安装时给出了以下错误: xxx: /lib64/libc.so.6: vers ...

  6. java动态跟踪分析工具BTrace实现原理

    今天,Team Leader推荐了一个非常棒的动态跟踪分析工具 – BTrace.由于对它的实现原理非常感兴趣,于是花了点时间研究了一下,顺便写点心得. 什么是BTrace? BTrace是SUN K ...

  7. 移动端自动化之Autox.js

    github: https://github.com/kkevsekk1/AutoX 官方文档:http://doc.autoxjs.com/ 1. 安装vscode的扩展插件 如果之前有使用 aut ...

  8. nvm node版本管理

    1.说明 NVM是NODE JS的版本管理工具,可以安装nodejs切换nodejs版本. 2.安装NVM https://github.com/coreybutler/nvm-windows/rel ...

  9. 西门子PLC与上位机通信方案梳理

    一.前言 大家好!我是付工. 西门子PLC是工控领域使用非常多的一种PLC品牌,对于上位机开发人员来说,对于西门子PLC的通信,我们一般可以采取哪些通信方式呢? 今天跟大家分享一下上位机实现与西门子P ...

  10. 全网最适合入门的面向对象编程教程:60 Python面向对象综合实例-传感器数据实时绘图器

    全网最适合入门的面向对象编程教程:60 Python 面向对象综合实例-传感器数据实时绘图器 摘要: 本文将结合之前内容实现模拟一个传感器系统软件,包括三个线程:传感器线程生成数据并通过串口发送给主机 ...