Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MSVC 编译工具 cl.exe 入门指南

MSVC 编译工具 cl.exe 入门指南

作者头像
运维开发王义杰
发布于 2024-06-11 10:18:22
发布于 2024-06-11 10:18:22
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

前言

Windows 平台上开发 C++ 程序时,Microsoft Visual C++ (MSVC) 提供了强大的编译工具集,其中最核心的命令行编译工具是 cl.exe。本文将详细介绍如何使用 cl.exe 手动编译和链接 C++ 程序,帮助开发者理解其基本用法和常见选项。

1. 准备环境

在使用 cl.exe 之前,需要确保已安装 Visual Studio,并配置好开发环境。可以通过以下步骤设置命令行编译环境:

  1. 打开 Visual Studio Installer,确保安装了“Desktop development with C++”工作负载。
  2. 通过 Visual Studio 命令提示符进入开发环境。可以在开始菜单中找到“x64 Native Tools Command Prompt for VS 2022”或类似的命令提示符。

2. 基本使用方法

2.1 编译单个源文件

最基本的使用方法是编译单个 C++ 源文件。假设有一个名为 hello.cpp 的源文件,可以通过以下命令进行编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

powershell
cl.exe /EHsc  .\hello.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.40.33811 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

hello.cpp
Microsoft (R) Incremental Linker Version 14.40.33811.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:hello.exe
hello.obj

此命令将生成一个名为 hello.exe 的可执行文件。选项 /EHsc 用于启用 C++ 异常处理。

2.2 编译并生成目标文件

有时需要将源文件编译为目标文件而不是直接生成可执行文件。这可以通过 /c 选项实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

bash
cl.exe /EHsc /c  .\hello.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.40.33811 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

hello.cpp

此命令将生成一个名为 hello.obj 的目标文件。

2.3 链接目标文件

可以使用 link.exe 工具将目标文件链接为可执行文件。但在命令行中,也可以直接使用 cl.exe 完成这一步:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

bash
 cl.exe .\hello.obj
Microsoft (R) C/C++ Optimizing Compiler Version 19.40.33811 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 14.40.33811.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:hello.exe
.\hello.obj

这将生成 hello.exe 可执行文件。

3. 常见编译选项

cl.exe 提供了许多选项以控制编译过程。以下是一些常见的编译选项:

  • /Fe:指定输出文件名。例如,cl /Feoutput.exe hello.cpp 将输出文件命名为 output.exe
  • /Fo:指定目标文件名。例如,cl /Fohello.obj /c hello.cpp 将目标文件命名为 hello.obj
  • /I:指定头文件搜索路径。例如,cl /Ipath\to\headers hello.cpp
  • /D:定义预处理器宏。例如,cl /DDEBUG hello.cpp 定义 DEBUG 宏。
  • /O2:优化生成代码以提高运行速度。
  • /Zi:生成调试信息。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


cl.exe /?
Microsoft (R) C/C++ Optimizing Compiler Version 19.40.33811 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

                         C/C++ COMPILER OPTIONS


                              -OPTIMIZATION-

/O1 maximum optimizations (favor space) /O2 maximum optimizations (favor speed)
/Ob<n> inline expansion (default n=0)   /Od disable optimizations (default)
/Og enable global optimization          /Oi[-] enable intrinsic functions
/Os favor code space                    /Ot favor code speed
/Ox optimizations (favor speed)         /Oy[-] enable frame pointer omission
/favor:<blend|ATOM> select processor to optimize for, one of:
    blend - a combination of optimizations for several different x86 processors
    ATOM - Intel(R) Atom(TM) processors

                             -CODE GENERATION-

/Gu[-] ensure distinct functions have distinct addresses
/Gw[-] separate global variables for linker
/GF enable read-only string pooling     /Gy[-] separate functions for linker
/GS[-] enable security checks           /GR[-] enable C++ RTTI
/guard:cf[-] enable CFG (control flow guard)
/guard:ehcont[-] enable EH continuation metadata (CET)
/EHs enable C++ EH (no SEH exceptions)  /EHa enable C++ EH (w/ SEH exceptions)
/EHc extern "C" defaults to nothrow
/EHr always generate noexcept runtime termination checks
/fp:<contract|except[-]|fast|precise|strict> choose floating-point model:
    contract - consider floating-point contractions when generating code
    except[-] - consider floating-point exceptions when generating code
    fast - "fast" floating-point model; results are less predictable
    precise - "precise" floating-point model; results are predictable
    strict - "strict" floating-point model (implies /fp:except)
/Qfast_transcendentals generate inline FP intrinsics even with /fp:except
/Qspectre[-] enable mitigations for CVE 2017-5753
/Qpar[-] enable parallel code generation
/Qpar-report:1 auto-parallelizer diagnostic; indicate parallelized loops
/Qpar-report:2 auto-parallelizer diagnostic; indicate loops not parallelized
/Qvec-report:1 auto-vectorizer diagnostic; indicate vectorized loops
/Qvec-report:2 auto-vectorizer diagnostic; indicate loops not vectorized
/GL[-] enable link-time code generation
/volatile:<iso|ms> choose volatile model:
    iso - Acquire/release semantics not guaranteed on volatile accesses
    ms  - Acquire/release semantics guaranteed on volatile accesses

4. 实践示例

4.1 编译多个源文件

假设有两个源文件 main.cpputils.cpp,可以使用以下命令编译并链接它们:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

bash
cl /EHsc main.cpp utils.cpp

这将生成一个名为 main.exe 的可执行文件。

4.2 使用预编译头

预编译头可以显著加快编译速度。以下是如何使用预编译头的示例:

创建一个名为 pch.h 的头文件,并在其中包含常用的头文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

cpp
// pch.h
#include <iostream>
#include <vector>

创建一个名为 pch.cpp 的源文件,仅包含对 pch.h 的引用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

cpp
// pch.cpp
#include "pch.h"

使用以下命令生成预编译头:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

bash
cl /EHsc /Yc"pch.h" pch.cpp

在其他源文件中使用预编译头,例如在 main.cpp 中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

cpp
// main.cpp
#include "pch.h"

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

编译时使用预编译头:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

bash
cl /EHsc /Yu"pch.h" main.cpp

5. 总结

通过本文的介绍,相信读者已经掌握了如何使用 cl.exe 手动编译和链接 C++ 程序的基本方法。cl.exe 提供了丰富的选项以满足不同的编译需求,熟练掌握这些选项可以显著提高开发效率。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP 高级编程之多线程
PHP 高级编程之多线程 http://netkiller.github.io/journal/php.thread.html ---- 目录 1. 多线程环境安装 1.1. PHP 5.5.9 1.2. 安装 pthreads 扩展 2. Thread 3. Worker 与 Stackable 4. 互斥锁 4.1. 多线程与共享内存 5. 线程同步 6. 线程池 6.1. 线程池 6.2. 动态队列线程池 6.3. pthreads Pool类 7. 多线程文件安全读写(文件锁) 8. 多线程与数据连
netkiller old
2018/03/05
2.8K0
用PHP读写文本文档制作最简单的访问计数器
通过PHP实现不用数据库,利用文本文档来制作一个网页访问计数器 新建counter.php文档,输入如下代码: <?php function get_hit($cou
夏时
2018/06/26
1K0
PHP实现网站访问量计数器
在Count_Visitor文件夹中,创建Count_Visitor.php文件,并键入以下代码:
用户8675788
2021/07/13
1.6K0
php pthreads多线程的安装与使用
安装Pthreads 基本上需要重新编译PHP,加上 –enable-maintainer-zts 参数,但是用这个文档很少;bug会很多很有很多意想不到的问题,生成环境上只能呵呵了,所以这个东西玩玩就算了,真正多线程还是用Python、C等等
超级小可爱
2023/02/23
8720
从并发处理谈PHP进程间通信(一)外部介质
枕边书
2018/01/04
1.3K0
2021年最新PHP 面试、笔试题汇总(一)
1.单一职责原则规定一个类有且仅有一个理由使其改变。换句话说,一个类的边界和职责应当是十分狭窄且集中的。我很喜欢的一句话"在类的职责问题上,无知是福"。一个类应当做它该做的事,并且不应当被它的任何依赖的变化所影响。
码农编程进阶笔记
2021/07/20
7920
2021年最新PHP 面试、笔试题汇总(一)
高并发幂等计数器的设计与实现
本文探讨了如何实现一个高并发、幂等的计数器服务,该服务用于处理外部的 inc 请求以增加特定视频的播放计数。考虑到网络延迟和重试等因素,该服务需要确保每个请求至少被处理一次,同时避免重复计数。我们使用了 MySQL 用于持久化存储计数数据,并用 Redis 进行幂等性检查。本文通过 Go、Java 和 Python 三种编程语言展示了具体的实现代码,并对核心逻辑进行了详细解释。Java 代码部分更是进行了全流程的展示,包括幂等性检查、数据库更新和已处理请求的记录。这样的设计不仅确保了高并发处理能力,还实现了请求的幂等性。
猫头虎
2024/04/09
3060
高并发幂等计数器的设计与实现
PHP文件锁
食堂管理员A有点偷懒,不想等那么久,于是就告诉大家,中午都可以来食堂吃饭,但是要跑快点才行,只有一个座位,第一个到的人就可以在食堂吃饭,然后就会锁门,其他人看到门锁上了就哪来的回哪去吧,这就是非阻塞型文件锁;
全栈程序员站长
2022/09/13
2.3K0
PHP文件锁
PHP常见面试题_php面试常问面试题
一. 基本知识点 1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。 200 : 请求成功,请求的数据随之返回。 301 : 永久性重定向。 302 : 暂时行重定向。 401 : 当前请求需要用户验证。 403 : 服务器拒绝执行请求,即没有权限。 404 : 请求失败,请求的数据在服务器上未发现。 500 : 服务器错误。一般服务器端程序执行错误。 503 : 服务器临时维护或过载。这个状态时临时性的。
全栈程序员站长
2022/09/27
7620
PHPer面试指南-php 篇(一)
· 单例模式:保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点。
码农编程进阶笔记
2021/07/20
6250
无比详细的PHP文件缓存类详解
private cache_dir; private expireTime=180; cache_dir是缓存文件所放的相对网站目录的父目录, expireTime(注释一)是我们缓存的数据过期的时间
PHP学习网
2022/12/17
1.7K0
【黄啊码】如何确保php上传的图片是安全的?
使用GD(或Imagick)重新处理图像并保存处理后的图像。 所有其他人对黑客来说只是有趣的无聊。
黄啊码
2022/06/10
1.2K0
计数器算法
计数器法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。那么我们可以这么做:在一开 始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个 请求的间隔时间还在1分钟之内,那么说明请求数过多;如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置 counter,具体算法的示意图如下:
码农戏码
2021/03/23
1.4K0
React系列:使用 React,并创建一个简单的计数器应用程序
首先,我们需要安装 Node.js 和 npm 包管理器。安装完成后,我们可以使用以下命令创建一个新的 React 应用程序:
知识浅谈
2023/12/18
4300
基于全局中间件 + Redis 实现 Laravel 全站访问计数器功能
上篇教程学院君已经给大家简单介绍了 Redis 的基本数据结构和常见使用场景,接下来我们就以 Laravel 项目为例来演示如何实现这些常见的业务功能。
学院君
2021/01/08
2.4K0
避坑:Go并发编程时,如何避免发生竞态条件和数据竞争
现在,我们已经知道了。在编写并发程序时,如果不谨慎,没有考虑清楚共享资源的访问方式和同步机制,那么就会发生竞态条件和数据竞争这些问题,那么如何避免踩坑?避免发生竞态条件和数据竞争的办法有哪些?请看下面:
不背锅运维
2023/04/25
1K0
避坑:Go并发编程时,如何避免发生竞态条件和数据竞争
【C#与Redis】--实践案例--案例 2:使用 Redis 实现计数器
在这个案例中,我们将演示如何使用 Redis 实现一个简单的计数器。计数器可以用于跟踪应用程序中的某些事件的发生次数,如用户访问次数、文章阅读次数等。我们将使用 StackExchange.Redis 库。
喵叔
2024/01/01
2940
MySQL计数器、每日计数器表设计与调优
如果应用在表中保存计数器,则在更新计数器时可能碰到并发问题。计数器表在Web应用中很常见。可以用这种表缓存一个用户的朋友数、文件下载次数等。创建一张独立的表存储计数器通常是个好主意,这样可使计数器表小且快。使用独立的表可以帮助避免查询缓存失效,并且可以使用本节展示的一些更高级的技巧。 应该让事情变得尽可能简单,假设有一个计数器表,只有行数据,记录网站的点击次数:
Java架构师必看
2021/05/14
2.5K0
搜索引擎自动提交连接php文件,死链检测工具(自动提交给百度,逆天了)
每个网站都避免不了404死链的存在。造成死链的原因有很多,比如说文章页被删除、链接被修改、网页链接更换存储路径等,这些都会成为死链。这些死链的产生,降低了搜索引擎对网站的友好度、影响用户体验,甚至会导致网站排名下降等。刚操作MAY博客的时候,文章的内容不是很多,遇到死链,只是简单的手动一个个去站长平台提交。但随着文章及页面的不断增加,一个个手动去操作,是不是麻烦了些。咦,是否能借助死链检测工具,自动提交给百度?
全栈程序员站长
2022/09/15
5760
最新PHP 面试、笔试题汇总(code happy)[通俗易懂]
读在前面: 面向对象编程和面向对象设计的五个基本原则「SOLID」 单一职责原则(Single Responsibility Principle) 开放封闭原则(Open Closed Principle) 里氏替换原则(Liskov Substitution Principle) 接口隔离原则(Interface Segregation Principle) 依赖反转原则(Dependency Inversion Principle) 1.单一职责原则规定一个类有且仅有一个理由使其改变。换句话说,一个类的边界和职责应当是十分狭窄且集中的。我很喜欢的一句话”在类的职责问题上,无知是福”。一个类应当做它该做的事,并且不应当被它的任何依赖的变化所影响。 2.开放封闭原则,又称开闭原则,规定代码对扩展是开放的,对修改是封闭的。 3.里氏替换原则规定对象可以被其子类的实例所替换,并且不会影响到程序的正确性。 4.接口隔离原则规定,不应该强制接口的实现依赖于它不使用的方法。 5.依赖反转原则,它规定高层次的代码不应该依赖低层级的代码。换句话说,高层次的代码应该依赖抽象接口,抽象接口就像是「中间人」一样,负责连接着高层次和低层次代码。这个原则的另一层意思是,抽象接口不应该依赖具体实现,但具体实现应该依赖抽象接口
全栈程序员站长
2022/09/05
1.4K0
推荐阅读
相关推荐
PHP 高级编程之多线程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验