MSVC,g++的简单使用

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:仅处理标准异常;cextern "C" 不抛异常)。

4. 输出文件控制

参数 作用
/Fe<file> 指定输出可执行文件路径(如 /Fe"bin\app.exe")。
/Fo<file> 指定 .obj 目标文件路径(如 /Fo"obj\main.obj")。
/Fd<file> 指定调试数据库(.pdb)路径(如 /Fd"debug\app.pdb")。

用于将 .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.libpython39.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
2
cl.exe /c /O2 /Zi main.cpp /Fo"obj/"  # 编译生成 .obj(仅编译不链接)
link.exe obj/main.obj /OUT:"bin/app.exe" /DEBUG /LIBPATH:"libs/" # 链接生成 exe

2. 编译为 Python 扩展模块(.pyd)

1
2
cl.exe /O2 /LD /I "%PYBIND11_INCLUDE%" /I "%PYTHON_INCLUDE%" example.cpp /link ^
/OUT:example.pyd /LIBPATH:"%PYTHON_LIB%" python39.lib
  • /LD 等价于 link.exe /DLL,生成动态库

  • 通过 /LIBPATHpython39.lib 链接 Python 导入库

通过VS项目属性(右键项目→属性)可图形化配置所有参数。

g++常用参数(简洁版)

g是GNU C编译器,常用参数如下:

  1. 基础控制

    • -c:仅编译生成.o目标文件,不链接
    • -o <文件名>:指定输出文件(如-o app.exe
    • -I<目录>:添加头文件搜索路径
  2. 语言标准

    • -std=c++11/c++17/c++20:指定C++标准
    • -std=c11:指定C语言标准
  3. 宏与警告

    • -D<宏>:定义宏(如-DDEBUG
    • -Wall:开启大部分警告;-Werror:警告视为错误
  4. 调试与优化

    • -g:生成调试信息(供gdb使用)
    • -O0:无优化(Debug);-O2:中度优化(常用);-O3:最高优化
  5. 链接控制

    • -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