官网参看链接:
编译器选项
演练:在命令行上编译 C 程序
CL 调用链接器
使用命令行编译 C/C++ 程序的完整指南(结合 cl.exe
和 link.exe
详解)
在本博客中,我们将深入介绍如何使用 Microsoft Visual C++ 编译器(cl.exe
)和链接器(link.exe
)在命令行编译 C/C++ 程序。我们将从基础的程序编写到对象文件(.obj
)的生成,再到最终可执行文件(.exe
)的生成,帮助你掌握完整的编译和链接过程。
cl.exe
和 link.exe
简介
cl.exe
是 Microsoft Visual C++ 编译器的命令行工具,它将 C 和 C++ 源代码编译为 通用对象文件格式 (COFF) 对象文件(.obj
)。接下来,链接器(link.exe
)会将这些对象文件合并成一个可执行文件(.exe
)或动态链接库(.dll
)。
编译器和链接器的作用分别是:
- 编译:
cl.exe
将源代码编译为对象文件(.obj
文件),cl.exe
自动调用link.exe
,将对象文件与必要的库文件链接,生成可执行文件(.exe)
。 - 链接:
link.exe
将这些对象文件与库文件一起链接,生成最终的可执行文件或动态链接库。
编译 C/C++ 程序的先决条件
在使用 cl.exe
和 link.exe
前,你需要安装 Visual Studio 或 Visual Studio Build Tools,并选择“C++ 桌面开发”工作负载。以下是详细步骤:
1. 下载和安装
- 访问 Visual Studio 官网,下载 Visual Studio 或者 Visual Studio Build Tools 以支持命令行编译。
- 安装过程中,选择“使用 C++ 进行桌面开发”工作负载。这将确保你有必要的编译器、链接器和库文件。
2. 打开开发人员命令提示窗口
安装完成后,打开 开发人员命令提示窗口,这是一个配置好的命令行环境,允许你使用 cl.exe
和 link.exe
。
打开步骤:
- 点击 Windows 开始菜单,找到 Visual Studio 2022 文件夹。
- 选择“VS 2022 开发人员命令提示”以打开命令行工具。
在命令提示符中输入以下命令,确认编译器配置正确:
cl
如果一切正常,应该会看到如下输出:
Microsoft (R) C/C++ Optimizing Compiler Version 19.10.25017 for x86
编写和编译第一个 C/C++ 程序
接下来,我们将编写一个简单的 C 程序,并展示如何使用 cl.exe
编译和使用 link.exe
进行链接。
在开发人员命令提示窗口中,输入 cd c:\
以将当前工作目录更改为 C: 驱动器的根目录。接下来,输入 md c:\hello
以创建目录,然后输入 cd c:\hello
以更改为该目录。此目录将保存源文件和编译的程序。
1. 编写源文件
在命令提示符中使用 notepad
创建一个 C 源文件:
notepad hello.c
在记事本中输入以下代码:
#include <stdio.h>
int main() {
printf("Hello, World! This is a C program compiled and linked via command line.\n");
return 0;
}
保存文件并关闭记事本。
2. 使用 cl.exe
编译源文件
现在,在命令行中使用 cl.exe
编译源文件:
cl hello.c
这个命令会自动进行编译和链接。编译器会将 hello.c
编译为对象文件(hello.obj
),然后使用 link.exe
链接生成可执行文件 hello.exe
。
你将看到类似以下的编译输出:
Microsoft (R) C/C++ Optimizing Compiler Version 19.10.25017 for x86
hello.c
Microsoft (R) Incremental Linker Version 14.10.25017.0
/out:hello.exe
hello.obj
3. 运行生成的可执行文件
编译和链接成功后,你可以通过以下命令运行 hello.exe
:
hello
输出应该是:
Hello, World! This is a C program compiled and linked via command line.
编译与链接的分步操作
在较大的 C++ 项目中,通常会将编译和链接分为两个步骤,特别是当有多个源文件时。
1. 只编译,不链接
如果你希望将编译与链接过程分开,可以使用 /c
选项仅生成对象文件(.obj
文件),而不进行链接。
示例:
cl /c hello.c
这个命令会生成 hello.obj
,而不会生成可执行文件。
2. 使用 link.exe
进行链接
接下来,使用 link.exe
将生成的 .obj
文件链接为可执行文件:
link hello.obj /out:hello.exe
这会生成 hello.exe
,你可以通过运行 hello
命令来验证结果。
多个源文件的编译与链接
在现实项目中,通常包含多个源文件。我们可以使用 cl.exe
和 link.exe
来处理多个对象文件的编译与链接。
1. 编写示例源文件
假设项目有两个源文件:
file1.c
file2.c
你可以首先单独编译它们:
cl /c file1.c
cl /c file2.c
这会生成 file1.obj
和 file2.obj
。
2. 链接多个对象文件
接下来,使用 link.exe
链接生成的 .obj
文件:
link file1.obj file2.obj /out:program.exe
这将生成一个名为 program.exe
的可执行文件。
编译选项与优化
cl.exe
提供了丰富的编译选项,可以帮助你控制代码的编译和优化过程。
1. 启用调试信息
使用 /Zi
选项生成调试信息,这样可以在调试器中调试生成的可执行文件:
cl /Zi hello.c
2. 禁用优化以便调试
使用 /Od
选项可以禁用编译优化,确保调试时的行为与源代码一致:
cl /Od hello.c
3. 启用优化以提升性能
使用 /O2
或 /Ox
选项可以启用编译优化,提升代码的执行效率:
cl /O2 hello.c
链接外部库
在某些情况下,你的程序可能依赖于外部库。你可以通过 link.exe
将外部库链接到你的程序中。
1. 编译程序并链接外部库
假设你有一个名为 mylib.lib
的外部库,你可以在链接时将其包括在内:
cl hello.c /link mylib.lib
这会将 mylib.lib
与程序一起链接生成可执行文件。
总结
通过本篇指南,你学习了如何使用 cl.exe
编译 C/C++ 程序,并通过 link.exe
完成对象文件的链接,生成可执行文件。无论是编译单个文件、多个源文件,还是与外部库链接,cl.exe
和 link.exe
都为命令行开发者提供了强大的工具集。
总结:
cl.exe
将 C/C++ 源代码编译为对象文件(.obj
)。link.exe
将对象文件与库链接,生成可执行文件(.exe
)或动态链接库(.dll
)。- 可以使用
/c
选项分离编译和链接过程,并通过多种优化选项提升程序性能。
希望通过这个完整指南,你能够在命令行中更高效地进行 C/C++ 程序的开发和管理。