Linux下C语言编程如何入门?

99ANYc3cd6
预计阅读时长 27 分钟
位置: 首页 C语言 正文

目录

  1. 第一步:环境准备
    • 安装 GCC 编译器
    • 安装 GDB 调试器
    • 选择代码编辑器
  2. 第二步:编写你的第一个 C 程序 ("Hello, World!")
    • 创建源代码文件
    • 代码解释
  3. 第三步:编译和运行程序
    • 使用 gcc 命令
    • 运行可执行文件
    • 常用编译选项 (-o, -Wall, -g)
  4. 第四步:使用 GDB 进行调试
    • 编译时加入调试信息
    • 启动 GDB
    • 常用 GDB 命令 (break, run, next, print, continue, quit)
  5. 第五步:多文件项目管理
    • 项目结构
    • main.c, utils.h, utils.c 示例
    • 使用 gcc 编译多个文件
    • 使用 Makefile 进行自动化构建
  6. 第六步:进阶主题
    • 使用 IDE (如 VS Code)
    • 版本控制 (Git)

第一步:环境准备

在开始之前,你需要确保你的 Linux 系统上安装了必要的工具。

linux编写c 语言程序
(图片来源网络,侵删)

安装 GCC 编译器

GCC (GNU Compiler Collection) 是 Linux 下最常用的 C/C++ 编译器。

打开你的终端,根据你的发行版使用相应的包管理器安装。

对于 Debian / Ubuntu / Mint:

sudo apt update
sudo apt install build-essential

build-essential 是一个元数据包,它会自动安装 gcc, g++, make 等编译所必需的核心工具。

linux编写c 语言程序
(图片来源网络,侵删)

对于 Fedora / CentOS / RHEL:

sudo dnf groupinstall "Development Tools"

或者

sudo yum groupinstall "Development Tools"

对于 Arch Linux:

sudo pacman -S base-devel

安装完成后,你可以通过以下命令验证 GCC 是否安装成功:

linux编写c 语言程序
(图片来源网络,侵删)
gcc --version

你应该能看到 GCC 的版本信息。

安装 GDB 调试器

GDB (GNU Debugger) 是一个强大的命令行调试工具。

对于 Debian / Ubuntu / Mint:

sudo apt install gdb

对于 Fedora / CentOS / RHEL:

sudo dnf install gdb

对于 Arch Linux:

sudo pacman -S gdb

验证安装:

gdb --version

选择代码编辑器

你可以使用任何你喜欢的文本编辑器来编写 C 代码。

  • Vim / Nano: 终端下的轻量级编辑器,非常高效。
  • VS Code (Visual Studio Code): 强大的免费开源编辑器,通过插件可以提供出色的 C/C++ 开发体验(代码补全、调试集成等)。
  • CLion: 专业的 C/C++ IDE,但需要付费(有免费的学生版和试用期)。

对于初学者,VS Code 是一个非常好的选择,因为它既强大又易于上手。


第二步:编写你的第一个 C 程序

让我们从最经典的 "Hello, World!" 开始。

创建源代码文件

打开终端,创建一个项目目录,然后创建一个名为 hello.c 的文件。

mkdir my-c-project
cd my-c-project
nano hello.c

(如果你使用 nano,按 Ctrl+O 保存,按 Ctrl+X 退出,如果使用 vim,按 Esc,然后输入 wq 保存退出。)

代码解释

hello.c 文件中输入以下代码:

#include <stdio.h> // 1. 包含标准输入输出库
// 2. main 函数是 C 程序的入口点
int main() {
    // 3. printf 函数用于在屏幕上打印文本
    printf("Hello, World!\n");
    // 4. main 函数返回 0,表示程序成功执行完毕
    return 0;
}

代码解释:

  1. #include <stdio.h>: 这是一个预处理指令,它会告诉编译器在编译前将 stdio.h 文件的内容包含进来。stdio.h (Standard Input/Output) 是一个标准库,包含了像 printf (格式化输出) 和 scanf (格式化输入) 这样的函数。
  2. int main(): 这是程序的主函数,当你的程序运行时,操作系统会首先调用这个函数。int 表示这个函数会返回一个整数值。
  3. printf("Hello, World!\n");: printf 函数在屏幕上打印引号内的字符串。\n 是一个转义字符,代表一个换行符。
  4. return 0;: 这行代码执行后,main 函数结束,并向操作系统返回 0,在 Unix/Linux 系统中,返回 0 通常表示程序成功执行,非零值则表示程序遇到了错误。

第三步:编译和运行程序

我们使用 gcc 编译器将 hello.c 转换为可执行的机器码。

使用 gcc 命令

在终端中,确保你还在 my-c-project 目录下,运行以下命令:

gcc hello.c

如果编译成功,你不会看到任何成功信息,但当前目录下会多一个名为 a.out 的文件,这是 GCC 默认输出的可执行文件名。

运行可执行文件

在 Linux 中,运行当前目录下的可执行文件,需要使用 前缀。

./a.out

你应该会在终端看到输出:

Hello, World!

常用编译选项

gcc 非常强大,通过选项可以控制编译过程。

  • -o (指定输出文件名) a.out 不够直观,我们可以用 -o 来指定一个更有意义的名字。

    gcc hello.c -o hello

    这会生成一个名为 hello 的可执行文件,运行它:

    ./hello
  • -Wall (显示所有警告) 这是一个非常重要的选项,它会开启所有常见的编译警告,警告不是错误,但它们可以帮助你发现潜在的问题和不规范写法。

    gcc -Wall hello.c -o hello

    即使没有警告,养成使用 -Wall 的习惯也是好的。

  • -g (包含调试信息) 如果你想使用 GDB 进行调试,必须在编译时加上 -g 选项,这样编译器才会生成调试器需要的符号表信息。

    gcc -g -Wall hello.c -o hello

第四步:使用 GDB 进行调试

让我们人为地在代码中制造一个 bug 来演示 GDB 的用法。

修改 hello.c 如下:

#include <stdio.h>
int add_numbers(int a, int b) {
    int sum = a + b; // 故意写错成 a - b
    return sum;
}
int main() {
    int x = 5;
    int y = 10;
    int result = add_numbers(x, y);
    printf("The result is: %d\n", result); // 预期输出 15,实际会输出 -5
    return 0;
}

编译时加入调试信息

使用 -g 选项重新编译:

gcc -g -Wall hello.c -o hello

启动 GDB

在终端输入 gdb 并指定要调试的可执行文件:

gdb ./hello

你会进入 GDB 的交互式界面,类似这样:

GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) ...
...
Reading symbols from ./hello...
(gdb)

(gdb) 是 GDB 的提示符。

常用 GDB 命令

(gdb) 提示符下输入命令:

  • l (list) 显示源代码。

    (gdb) l
    1   #include <stdio.h>
    2   
    3   int add_numbers(int a, int b) {
    4       int sum = a - b; // 故意写错成 a - b
    5       return sum;
    6   }
    7   
    8   int main() {
    9       int x = 5;
    10      int y = 10;
    ...
  • b (break) 在指定行设置断点(程序会在此暂停)。

    (gdb) b 4
    Breakpoint 1 at 0x555555555153: file hello.c, line 4.

    或者设置函数断点:

    (gdb) b add_numbers
    Breakpoint 2 at 0x55555555514a: file hello.c, line 4.
  • r (run) 开始运行程序,直到遇到断点。

    (gdb) r
    Starting program: /home/user/my-c-project/hello 
    Breakpoint 1, add_numbers (a=5, b=10) at hello.c:4
    4       int sum = a - b;
  • n (next) 执行下一行代码(不进入函数内部)。

    (gdb) n
    5       return sum;
  • p (print) 打印变量的值。

    (gdb) p sum
    $1 = -5
    (gdb) p a
    $2 = 5
    (gdb) p b
    $3 = 10

    现在我们看到了问题!sum 的值是 -5,而不是预期的 15

  • c (continue) 继续运行程序,直到下一个断点或程序结束。

    (gdb) c
    Continuing.
    The result is: -5
    Program exited normally.

    程序打印出错误的结果后正常退出。

  • q (quit) 退出 GDB。

    (gdb) q
    A debugging session is active.
    Inferior 1 [process 12345] will be killed.
    Quit anyway? (y or n) y

通过 GDB,我们成功地定位了代码中的错误。


第五步:多文件项目管理

当项目变大时,将所有代码都写在一个 .c 文件中是不可行的,通常我们会将代码分为:

  • 头文件 (.h): 包含函数声明、宏定义、结构体等,作为接口。
  • 源文件 (.c): 包含函数的具体实现。

项目结构

my-better-project/
├── main.c      // 程序入口
├── utils.h     // 函数声明
└── utils.c     // 函数实现

示例代码

utils.h

#ifndef UTILS_H
#define UTILS_H
// 声明一个函数,告诉其他文件这个函数存在
int add(int a, int b);
int multiply(int a, int b);
#endif // UTILS_H

注意: #ifndef, #define, #endif头文件卫士,可以防止头文件被重复包含。

utils.c

#include "utils.h" // 引用自己的头文件
// add 函数的实现
int add(int a, int b) {
    return a + b;
}
// multiply 函数的实现
int multiply(int a, int b) {
    return a * b;
}

main.c

#include <stdio.h>
#include "utils.h" // 引入我们自己写的头文件
int main() {
    int x = 10;
    int y = 5;
    printf("Sum: %d\n", add(x, y));
    printf("Product: %d\n", multiply(x, y));
    return 0;
}

使用 gcc 编译多个文件

你可以一次性编译所有文件:

gcc main.c utils.c -o my_program

或者分步编译(推荐,因为只修改了 utils.c 时,只需重新编译它):

# 1. 将 utils.c 编译成目标文件
gcc -c utils.c -o utils.o
# 2. 将 main.c 编译成目标文件
gcc -c main.c -o main.o
# 3. 将目标文件链接成最终的可执行程序
gcc main.o utils.o -o my_program

.o 文件是目标文件,是机器码,但还没有被链接成一个完整的可执行程序。

使用 Makefile 进行自动化构建

每次都手动输入 gcc 命令很繁琐。Makefile 可以定义一套规则来自动化编译过程。

my-better-project 目录下创建一个名为 Makefile 的文件(注意没有后缀名):

Makefile

# 定义变量
CC = gcc          # C 编译器
CFLAGS = -Wall -g # 编译选项
TARGET = my_program # 目标文件名
# all 是一个伪目标,表示默认要执行的任务
all: $(TARGET)
# 定义如何从 .o 文件链接生成最终目标
# $@ 表示目标文件名,$^ 表示所有依赖文件
$(TARGET): main.o utils.o
    $(CC) $(CFLAGS) $^ -o $@
# 定义如何从 .c 文件生成 .o 文件
# %.o 是模式匹配,代表所有的 .o 文件
# $< 代表第一个依赖文件
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@
# clean 是一个伪目标,用于清理生成的文件
clean:
    rm -f $(TARGET) *.o
# .PHONY 表示 clean 是一个伪目标,防止和同名文件冲突
.PHONY: clean all

你只需要在终端中输入 make 命令,它就会自动读取 Makefile 并执行编译:

make

如果要清理生成的文件:

make clean

Makefile 是专业项目管理的核心,务必掌握。


第六步:进阶主题

使用 IDE (如 VS Code)

  1. 安装 VS Code: 从 官网 下载并安装。
  2. 安装 C/C++ 扩展: 打开 VS Code,进入扩展市场,搜索 "C/C++" 并安装由 Microsoft 发布的那个。
  3. 打开项目: File -> Open Folder...,选择你的项目文件夹(如 my-better-project)。
  4. 配置编译器: VS Code 通常能自动找到 GCC,如果不行,可以在 VS Code 的设置中指定路径。
  5. 使用: VS Code 会提供语法高亮、代码补全、错误提示,你可以通过安装 "Code Runner" 等插件实现一键编译,或者配置 tasks.json 来集成 make 命令,调试功能也可以通过图形界面轻松配置。

版本控制

对于任何项目,使用版本控制系统(如 Git)都是至关重要的,它可以跟踪代码的每一次修改,让你可以轻松回滚到旧版本,或者与他人协作。

  1. 安装 Git:
    # Debian/Ubuntu
    sudo apt install git
    # Fedora
    sudo dnf install git
  2. 初始化仓库:
    git init
    git config --global user.name "Your Name"
    git config --global user.email "your.email@example.com"
  3. 添加和提交文件:
    git add .
    git commit -m "Initial commit: Add hello world and utils"

将你的代码托管到 GitHub、GitLab 或 Gitee 上,可以更好地保护你的代码并实现团队协作。

在 Linux 上进行 C 语言开发,核心流程是:

  1. 编写代码: 使用编辑器创建 .c.h 文件。
  2. 编译: 使用 gcc 将源代码编译成可执行文件。
  3. 调试: 使用 gdb 定位和修复代码中的逻辑错误。
  4. 构建: 对于多文件项目,使用 Makefile 来自动化编译和链接过程。
  5. 管理: 使用 Git 进行版本控制。

这个指南为你提供了一个坚实的基础,随着你经验的增长,你可以进一步探索 C 语言的更多高级特性,如内存管理、指针、多线程、系统调用等,祝你编程愉快!

-- 展开阅读全文 --
头像
织梦后台验证码错误怎么办?
« 上一篇 02-15
dede 1970-1-1是什么时间问题?
下一篇 » 02-15
取消
微信二维码
支付宝二维码

目录[+]