MSVC,g++ 使用参数
cl.exe(MSVC 编译器)和 link.exe(链接器)的参数功能明确分工,前者负责编译源代码,后者负责链接目标文件生成最终产物。以下是两者常用参数的详细介绍:
一、cl.exe(编译器)常用参数
主要用于控制编译过程(预处理、编译、汇编),生成目标文件(.obj)。
1. 基础编译控制
| 参数 | 作用 |
|---|---|
/c |
仅编译不链接,生成 .obj 目标文件(不生成可执行文件或库)。 |
/I<dir> |
指定头文件搜索目录(如 /I "C:\pybind11\include"),可多次使用。 |
/D<macro> |
定义预处理宏(如 /DDEBUG 等价于 #define DEBUG),支持带值宏:/DVERSION=10。 |
/E |
仅执行预处理,将结果输出到控制台(用于调试宏和头文件展开问题)。 |
/TP |
强制将所有文件视为 C++ 代码(忽略 .c 扩展名)。 |
/TC |
强制将所有文件视为 C 代码(忽略 .cpp 扩展名)。 |
2. 优化选项
| 参数 | 作用 |
|---|---|
/O0 |
禁用优化(默认,保留调试信息,适合开发阶段)。 |
/O1 |
轻度优化(优先减小代码体积)。 |
/O2 |
高度优化(优先提升运行速度,发布版本常用)。 |
/Ox |
最大化优化(包含 /O2 的所有优化,额外启用部分激进优化)。 |
/Od |
禁用优化(同 /O0,调试专用)。 |
3. 调试与错误控制
| 参数 | 作用 |
|---|---|
/Zi |
生成完整调试信息(.pdb 文件),保留变量名和代码映射,适合调试。 |
/Z7 |
将调试信息嵌入 .obj 文件(不生成单独 .pdb)。 |
/W<level> |
警告级别(/W0 禁用,/W1 轻度,/W2 默认,/W3 详细,/W4 严格)。 |
/WX |
将警告视为错误(编译时遇到警告即终止)。 |
/EHsc |
启用 C++ 异常处理(s:仅处理标准异常;c:extern "C" 不抛异常)。 |
4. 输出文件控制
| 参数 | 作用 |
|---|---|
/Fe<file> |
指定输出可执行文件路径(如 /Fe"bin\app.exe")。 |
/Fo<file> |
指定 .obj 目标文件路径(如 /Fo"obj\main.obj")。 |
/Fd<file> |
指定调试数据库(.pdb)路径(如 /Fd"debug\app.pdb")。 |
二、link.exe(链接器)常用参数
用于将 .obj 目标文件和库文件(.lib)链接为最终产物(.exe/.dll/.pyd),参数需跟在 cl.exe 的 /link 后传递(或直接作为 link.exe 的命令参数)。
1. 输出文件控制
| 参数 | 作用 |
|---|---|
/OUT:<file> |
指定输出文件路径(如 /OUT:example.pyd 生成 Python 扩展模块)。 |
/PDB:<file> |
指定调试数据库(.pdb)路径(如 /PDB:example.pdb)。 |
/LIBPATH:<dir> |
指定库文件(.lib)搜索目录(如 /LIBPATH:"C:\Python39\libs")。 |
2. 库与依赖控制
| 参数 | 作用 |
|---|---|
<libname.lib> |
显式链接指定库文件(如 kernel32.lib、python39.lib)。 |
/DEFAULTLIB:<lib> |
指定默认链接的库(若与 /NODEFAULTLIB 冲突,优先使用此参数)。 |
/NODEFAULTLIB |
不链接默认库(需手动指定所有依赖库,避免冲突时使用)。 |
3. 动态库(DLL/.pyd)相关
| 参数 | 作用 |
|---|---|
/DLL |
生成动态链接库(.dll),Python 扩展模块 .pyd 需用此参数(cl.exe 中可简写为 /LD)。 |
/EXPORT:<sym> |
导出 DLL 中的符号(如函数/变量,pybind11 会自动处理,无需手动指定)。 |
4. 其他常用参数
| 参数 | 作用 |
|---|---|
/DEBUG |
生成调试信息(需配合编译器的 /Zi 或 /Z7 使用)。 |
/INCREMENTAL |
启用增量链接(仅重新链接修改过的部分,加速编译,默认开启)。 |
/NOINCREMENTAL |
禁用增量链接(生成完整链接产物,适合发布版本)。 |
/SUBSYSTEM:<sys> |
指定目标子系统(如 /SUBSYSTEM:CONSOLE 控制台程序,/SUBSYSTEM:WINDOWS 窗口程序)。 |
三、典型组合示例
1. 编译并链接为可执行程序
1 | cl.exe /c /O2 /Zi main.cpp /Fo"obj/" # 编译生成 .obj(仅编译不链接) |
2. 编译为 Python 扩展模块(.pyd)
1 | cl.exe /O2 /LD /I "%PYBIND11_INCLUDE%" /I "%PYTHON_INCLUDE%" example.cpp /link ^ |
-
/LD等价于link.exe /DLL,生成动态库 -
通过
/LIBPATH和python39.lib链接 Python 导入库
通过VS项目属性(右键项目→属性)可图形化配置所有参数。
g++常用参数(简洁版)
g是GNU C编译器,常用参数如下:
-
基础控制
-c:仅编译生成.o目标文件,不链接-o <文件名>:指定输出文件(如-o app.exe)-I<目录>:添加头文件搜索路径
-
语言标准
-std=c++11/c++17/c++20:指定C++标准-std=c11:指定C语言标准
-
宏与警告
-D<宏>:定义宏(如-DDEBUG)-Wall:开启大部分警告;-Werror:警告视为错误
-
调试与优化
-g:生成调试信息(供gdb使用)-O0:无优化(Debug);-O2:中度优化(常用);-O3:最高优化
-
链接控制
-L<目录>:添加库文件搜索路径-l<库名>:链接指定库(如-lpthread链接线程库)-shared:生成动态库(.so)
g++与MSVC参数对比整合表
| 功能类别 | g++参数 | MSVC参数(cl.exe/link.exe) | 说明 |
|---|---|---|---|
| 输出指定 | -o <文件> |
/Fe<文件>(cl)//OUT:<文件>(link) |
指定最终输出文件 |
| 仅编译 | -c |
/c(cl) |
只生成目标文件,不链接 |
| 头文件路径 | -I<目录> |
/I<目录>(cl) |
添加头文件搜索目录 |
| C++标准 | -std=c++20 |
/std:c++20(cl) |
指定C++标准版本 |
| 宏定义 | -DDEBUG |
/DDEBUG(cl) |
定义预处理宏 |
| 警告控制 | -Wall -Werror |
/W4 /WX(cl) |
开启警告并视为错误 |
| 调试信息 | -g |
/Zi(cl)+/DEBUG(link) |
生成调试符号 |
| 优化级别 | -O0(无)/ -O2(中) |
/Od(无)/ /O2(中)(cl) |
控制代码优化程度 |
| 库路径 | -L<目录> |
/LIBPATH:<目录>(link) |
添加库文件搜索目录 |
| 链接库 | -l<库名>(如-lm) |
<库名.lib>(如math.lib)(link) |
链接指定库文件 |
| 生成动态库 | -shared |
/DLL(link) |
生成动态链接库 |
示例对比:
-
g++编译Debug版本:
g++ -c -g -O0 -Wall main.cpp -o obj/main.o
g++ obj/main.o -o app.exe -
MSVC编译Debug版本:
cl /c /Zi /Od /W4 main.cpp /Foobj/main.obj
link obj/main.obj /DEBUG /OUT:app.exe