菜鸟科技网

gcc运行命令

最简单的编译和运行

这是 GCC 最核心、最基础的两个步骤。

gcc运行命令-图1
(图片来源网络,侵删)

编译

将一个 C 语言源文件(hello.c)编译成一个可执行文件。

gcc hello.c -o hello

命令分解:

  • gcc: 调用 GCC 编译器。
  • hello.c: 指定要编译的源文件。
  • -o hello: 指定输出的可执行文件名。-o 是选项,hello 是你给可执行文件起的名字。如果不加 -o,GCC 默认会生成一个名为 a.out 的文件

运行

编译成功后,你会得到一个可执行文件(在 Windows 上可能是 hello.exe),在终端中运行它:

  • 在 Linux 或 macOS 上:

    gcc运行命令-图2
    (图片来源网络,侵删)
    ./hello

    告诉终端在当前目录下查找这个可执行文件。

  • 在 Windows (命令提示符或 PowerShell) 上:

    hello.exe

完整示例:

假设你有一个 hello.c 文件,内容如下:

gcc运行命令-图3
(图片来源网络,侵删)
#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}

在终端中执行以下命令:

# 1. 编译
gcc hello.c -o hello
# 2. 运行
./hello

预期输出:

Hello, World!

常用编译选项

在实际开发中,我们通常会使用更多的选项来控制编译过程。

调试选项:-g

生成包含调试信息(如变量名、行号)的可执行文件,这样你才能使用 GDB 等调试工具来分析程序。

gcc -g hello.c -o hello_debug

优化选项:-O1, -O2, -O3, -Ofast

对生成的代码进行优化,以提高程序运行速度,数字越大,优化级别越高,但编译时间也越长。

  • -O1: 基础优化。
  • -O2: 推荐的优化级别,在性能和编译时间之间取得了很好的平衡。
  • -O3: 更激进的优化,可能会显著增加代码大小。
  • -Ofast: 类似于 -O3,但还会启用一些不严格遵循标准的优化(如 -ffast-math)。
# 使用 O2 优化级别进行编译
gcc -O2 hello.c -o hello_optimized

注意:在调试时,通常不使用或使用较低的优化级别(如 -O0,即不优化),因为高优化可能会改变代码执行顺序,使调试变得困难。

警告选项:-Wall, -Wextra

让 GCC 编译器尽可能多地输出警告信息。强烈建议在编译时始终开启 -Wall,这可以帮助你发现很多潜在的错误。

  • -Wall: 启用所有常见的警告。
  • -Wextra: 启用一些额外的、不那么常见的警告。
# 开启所有警告进行编译
gcc -Wall hello.c -o hello_with_warnings

示例: 如果你写了这样一段有问题的代码:

#include <stdio.h>
int main() {
    int a = 10;
    int b; // 变量 b 被定义但未初始化
    a = b; // 使用了未初始化的变量 b
    printf("%d\n", a);
    return 0;
}

使用 gcc -Wall 编译,你会得到警告:

hello.c: In function 'main':
hello.c:7:7: warning: 'b' is used uninitialized in this function [-Wuninitialized]
     a = b;
       ^

标准选项:-std

指定 C 语言的标准版本,这有助于保证代码的可移植性并使用特定版本的特性。

  • -std=c89 / -std=iso9899:1990: C89/C90 标准。
  • -std=c99 / -std=iso9899:1999: C99 标准,引入了很多有用的特性。
  • -std=c11 / -std=iso9899:2011: C11 标准。
  • -std=c17 / -std=iso9899:2025: C17 标准。
  • -std=gnu11: GNU 对 C11 的扩展,默认情况下 GCC 就使用这个。
# 按照C99标准编译
gcc -std=c99 -Wall hello.c -o hello_c99

多文件编译

在实际项目中,代码通常分布在多个文件中,GCC 可以一次性编译多个源文件。

假设你的项目有三个文件:

  • main.c: 包含 main 函数。
  • utils.c: 包含一些辅助函数。
  • utils.h: utils.c 中函数的声明(头文件)。 示例:**

utils.h

// 函数声明
void print_message(const char *msg);
int add(int a, int b);

utils.c

#include <stdio.h>
#include "utils.h" // 引用自己的头文件
void print_message(const char *msg) {
    printf("Message: %s\n", msg);
}
int add(int a, int b) {
    return a + b;
}

main.c

#include "utils.h"
int main() {
    print_message("Hello from main!");
    int sum = add(5, 3);
    printf("The sum is: %d\n", sum);
    return 0;
}

编译命令:

你可以将所有源文件一次性编译成一个可执行文件:

gcc main.c utils.c -o my_program

GCC 会按顺序编译 main.cutils.c,然后将它们链接成一个名为 my_program 的可执行文件。


生成共享库 (.so / .dll)

如果你想把一部分代码编译成库供其他程序使用,而不是直接生成可执行文件,可以使用 -shared-fPIC 选项。

  • -fPIC (Position-Independent Code): 生成位置无关代码,这是创建共享库所必需的。
  • -shared: 生成一个共享库(在 Linux/macOS 上是 .so 文件,在 Windows 上是 .dll 文件)。
# 将 utils.c 编译成共享库
gcc -fPIC -shared utils.c -o libutils.so

如何使用这个库? 编译 main.c 时,需要告诉链接器去哪里找这个库,以及库的名称。

  • -L.: 指定库的搜索路径为当前目录 ()。
  • -lutils: 指定要链接的库名,链接器会自动在库名前加 lib,后缀加上系统默认的库扩展名(如 .so.dll),-lutils 实际上链接的是 libutils.so
# 编译 main.c 并链接 libutils.so
gcc main.c -L. -lutils -o my_program_with_lib

总结与常用命令组合

功能 命令示例 说明
基本编译 gcc hello.c -o hello 最简单的编译和链接
开启警告 gcc -Wall hello.c -o hello 强烈推荐,帮助发现潜在问题
开启调试 gcc -g hello.c -o hello 生成带调试信息的可执行文件
优化代码 gcc -O2 hello.c -o hello 在性能和编译时间间平衡的优化
指定标准 gcc -std=c99 -Wall hello.c -o hello 使用 C99 标准
开发模式 gcc -g -Wall -std=c99 hello.c -o hello 最推荐的日常开发组合
多文件编译 gcc main.c utils.c -o my_app 一次性编译多个源文件
生成共享库 gcc -fPIC -shared utils.c -o libutils.so 创建可被其他程序链接的库

掌握这些命令和选项,你就可以应对绝大多数 C 语言的编译场景了,对于更复杂的项目,通常会使用 MakeCMake 等构建工具来自动化编译过程。

分享:
扫描分享到社交APP
上一篇
下一篇