编译C++的几种方式(MSVC编译器)

文章目录

    • [VS 集成开发环境](#VS 集成开发环境)
    • 命令行
      • [VS 开发者命令行](#VS 开发者命令行)
      • [在普通命令行(cmd / PowerShell)](#在普通命令行(cmd / PowerShell))
    • [使用 CMake 与 CMakeLists.txt](#使用 CMake 与 CMakeLists.txt)

VS 集成开发环境

创建 VS 程序后,按 Ctrl + F5(不调试运行)或 F5(调试运行),VS 会自动调用 MSVC 编译器(cl.exe)进行编译和链接。编译输出位于 x64\Debug\ 或 x64\Release\(取决于配置)。

此外,在 VS 中还可以通过图形化界面设置其它的头文件路径、库链接等。

命令行

VS 开发者命令行

VS 开发者命令行自动设置了 MSVC 编译器所需的环境变量(PATHINCLUDELIB)。安装好 VS 后,在开始菜单搜索,Developer Command Prompt for VS [具体版本],在改命令行中执行编译命令,例如编译单个文件:

bash 复制代码
cl main.cpp

在程序源码目录下生成了相应的main.obj 和可执行文件 main.exe。也可以添加编译选项,常用编译选项:

选项 说明
/EHsc 启用 C++ 异常处理
/std:c++17/std:c++20 指定 C++ 标准
/Fe:output.exe 指定输出可执行文件名
/I"path" 添加头文件搜索路径
/link 后接链接器选项(如 /link user32.lib

在普通命令行(cmd / PowerShell)

普通命令行默认无法直接使用 cl.exe,因为缺少环境变量。但可以通过手动调用 Visual Studio 的环境设置脚本来启用。

在普通命令行中启用:

bash 复制代码
"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"

(根据实际安装目录和版本设置)

但这种方式只是临时生效,每次打开普通命令行都需要执行上面的批处理脚本。

使用 CMake 与 CMakeLists.txt

Windows 上通常不使用 Makefile,而是使用 Visual Studio Generator 生成 Visual Studio 项目文件(.sln/.vcxproj)

首先编写 CMakeLists.txt:

bash 复制代码
cmake_minimum_required(VERSION 3.14)
project(MyApp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(hello main.cpp)

然后生成构建系统:

bash 复制代码
cmake -S . -B build -G "Visual Studio 17 2022" -A x64

("Visual Studio 17 2022" 根据自己版本设置)

然后打开 build/MyApp.sln 用 VS 编译(打开后右键解决方案:生成解决方案),也可以使用命令行编译:

bash 复制代码
cmake --build build --config Release

以上均不需要在 VS 开发者命令行中执行。

或直接用msbuild编译(需要命令行具有VS环境):

bash 复制代码
msbuild MyApp.sln /p:Configuration=Release /p:Platform=x64

msbuild编译方式可以在命令行中看到更多编译信息。

相关推荐
gumichef11 分钟前
第一章:面向对象核心——类和对象深度讲解
开发语言·c++
冷咖啡离 我的笨笨15 分钟前
数据去重:通过 C# 删除 Excel 中的重复行
开发语言·c#·excel
郝学胜-神的一滴26 分钟前
[简化版 GAMES 104] 现代游戏引擎 04:从0到1构建你的游戏世界
c++·游戏·unity·游戏引擎·软件工程·unreal engine
Bryce学亮33 分钟前
FileLine,基于 Qt 6 + QML 构建的跨平台文件传输与即时通讯工具
数据库·c++·人工智能·python·qt·github
旖旎夜光44 分钟前
LeetCode 991: 坏了的计算器(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
夜雪一千1 小时前
Python从HTML提取纯文本、去空格、比对内容是否变化:方案+合理性分析
开发语言·python·html
烂蜻蜓1 小时前
Node.js入门教程(一):初识Node.js——服务端JavaScript的诞生与特点
开发语言·javascript·node.js
旖旎夜光1 小时前
LeetCode 553:最优除法(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
北冥you鱼3 小时前
Go语言大数(big.Int)比较大小:原理、方法与最佳实践
开发语言·后端·golang
宁之明起(B服)3 小时前
Java 反序列化漏洞-xmldecoder/SnakeYAM
java·开发语言