msvc交叉编译:使用vcvarsall.bat设置命令行编译环境

一直以来我只知道vc设置命令行编译环境的批处理命令是%VS140COMNTOOLS%/Common7/Tools下的vsvars32.bat,(%VS140COMNTOOLS%为定义vs2015公共工具程序位置的环境变量,命令行窗口输入set就能找到,vs2010的对应定义为%VS100COMNTOOLS%)
微软的官网上有这个命令的说明:
https://technet.microsoft.com/zh-cn/library/1700bbwd.aspx

但在执行这个命令生成的命令行环境下用nmake只能编译32位版本的代码,我一直都不知道如何用nmake编译64位的代码。
今天才搞明白vsvars32.bat已经过时了,正确的打开方式是vcvarsall.bat 。
至少从vs2010开始,
%VS140COMNTOOLS%/VC下就有vcvarsall.bat,用于生成命令行编译环境。
如果要在命令行生成 32位代码,就执行vcvarsall x86
如果要在32位系统下生成64位代码,就执行vcvarsall x86_amd64
如果要在64位系统下生成32位代码,就执行vcvarsall x86vcvarsall amd64_x86
到了VS2015,已经支持arm平台了,所以如果要生成arm平台的代码,就执行vcvarsall x86_arm 如果你的操作系统是64位的也可以 vcvarsall amd64_arm

前面一个名字代表你的当前电脑的体系结构,后面的这个名字代表你要生成的代码的体系结构。如果两个名字一样,就简化为一个名字。
搞清楚了这个,今天终于顺利在命令行下实现nmake编译32位和64位版本代码:

生成用于编译32位代码的命令行编译环境


C:\Program Files (x86)\Microsoft Visual Studio 14.0>cd VC
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>vcvarsall x86

执行cmake生成NMake格式的Makefile,指定处理器为x86,然后执行nmake编译所有代码,并安装

>cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=RELEASE -DTARGET_PROCESSOR=x86 ..\facecl 
>nmake install

安装成功的输出

Install the project...
-- Install configuration: "RELEASE"
-- Installing: C:/Program Files (x86)/facecl/lib/static/detect_cl.lib
-- Installing: C:/Program Files (x86)/facecl/bin/detect_cl.dll
-- Installing: C:/Program Files (x86)/facecl/lib/static/img_tool.lib
-- Installing: C:/Program Files (x86)/facecl/bin/img_tool.dll
-- Installing: C:/Program Files (x86)/facecl/bin/test_detect.exe
-- Up-to-date: C:/Program Files (x86)/facecl/./README_utf8.txt
-- Up-to-date: C:/Program Files (x86)/facecl/include/detect_cl_types.h
-- Up-to-date: C:/Program Files (x86)/facecl/include/detect_cl.h
-- Up-to-date: C:/Program Files (x86)/facecl/include/img_tool.h
-- Up-to-date: C:/Program Files (x86)/facecl/sample/test_detect.cpp
-- Up-to-date: C:/Program Files (x86)/facecl/sample/utility.h
-- Up-to-date: C:/Program Files (x86)/facecl/sample/raii.h
-- Up-to-date: C:/Program Files (x86)/facecl/sample/assert_macros.h
-- Up-to-date: C:/Program Files (x86)/facecl/sample/cmdline.h
-- Up-to-date: C:/Program Files (x86)/facecl/sample/dirent.h
-- Up-to-date: C:/Program Files (x86)/facecl/sample/file_utilits.h
-- Up-to-date: C:/Program Files (x86)/facecl/sample/time_utilits.h

如果要在32位系统下生成64位代码,也如法炮制

关于vcvarsall.bat更详细的说明,参见微软的官方文档:
https://msdn.microsoft.com/zh-cn/library/f2ccy3wt.aspx

<think>嗯,用户想了解MSVC工具链。首先,我需要确认自己对MSVC的理解是否正确。MSVC全称是Microsoft Visual C++,是微软开发的C和C++编译器工具链。作为Windows平台开发的重要工具,它和Visual Studio集成紧密,但也有独立的版本。 用户可能是开发者,可能在选择开发工具时遇到困惑,或者需要针对Windows平台进行C++开发。需要明确MSVC的组成部分,比如编译器cl.exe,链接器link.exe,还有库管理器lib.exe等。这些工具的作用是什么,如何协同工作? 然后,MSVC工具链的特点有哪些?比如对Windows API的支持,与Visual Studio的集成,调试工具,以及最新的C++标准支持情况。用户可能关心兼容性、性能优化选项,比如/O2、/MT这样的编译选项。 还要考虑用户的使用场景,是否在Windows环境下开发桌面应用、游戏或者系统软件?是否需要跨平台支持?可能还需要提到MSVC的跨平台编译能力,比如通过Clang/C2或者现在的Clang集成。 另外,MSVC的版本更新情况也很重要。比如VS2022中的MSVC版本,支持C++20、C++23的特性,以及微软在编译器优化方面的改进。还有MSVC与其他工具链的对比,比如GCC、Clang,各自的优缺点。 可能用户会遇到的问题,比如环境变量配置,如何在命令行使用MSVC而不启动Visual Studio IDE,或者如何处理依赖库的问题。这时候需要提到vcpkg这样的包管理工具,以及MSVC的兼容性设置。 最后,是否需要给出使用MSVC的简单示例,比如编译一个Hello World程序,展示cl.exe的基本用法?或者介绍项目构建工具如MSBuild、CMake与MSVC的配合使用? 需要确保回答结构清晰,分点说明组成部分、特点、使用场景、常见工具链对比,以及基本使用示例。同时注意使用中文,避免技术术语过于晦涩,让不同水平的用户都能理解。</think>以下是对MSVC工具链的逐步解析: 1. **定义与定位** - MSVC(Microsoft Visual C++)是微软开发的C/C++编译器工具链,专为Windows平台优化 - 核心组件包含在Visual Studio中,也可通过独立构建工具单独安装 - 最新版本持续支持C++20/23标准(截至2024年支持约80% C++20特性) 2. **核心组件构成** $$ \text{MSVC工具链} = \begin{cases} \text{编译器(cl.exe)} \\ \text{链接器(link.exe)} \\ \text{库管理器(lib.exe)} \\ \text{资源编译器(rc.exe)} \\ \text{调试工具(MSVC Debugger)} \\ \text{Windows SDK集成} \end{cases} $$ 3. **关键特性** - 深度集成Windows API - 支持COM组件开发 - 独有的`#pragma`指令集 - 提供增量编译(/Gm)和多处理器编译(/MP)优化 - 安全增强选项:/GS(缓冲区安全检查)、/sdl(安全开发生命周期) 4. **典型应用场景** - Windows桌面应用程序开发(如使用MFC/Win32 API) - DirectX游戏开发 - .NET混合编程(C++/CLI) - 系统驱动开发(需配合WDK) 5. **环境配置示例(命令行)** ```bat :: 调用VC环境变量 call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 :: 编译示例 cl /EHsc /Fe:hello.exe hello.cpp ``` 6. **性能优化实践** | 优化选项 | 作用描述 | |----------|---------------------------------| | /O2 | 最大化速度优化 | | /Oi | 启用内部函数 | | /fp:fast | 快速浮点运算 | | /GL | 全程序优化 | 7. **跨平台兼容方案** - 通过`clang-cl`前端支持LLVM生态 - 兼容CMake构建系统: ```cmake cmake_minimum_required(VERSION 3.25) project(MSVCDemo) add_executable(demo main.cpp) set(CMAKE_CXX_COMPILER "clang-cl") ``` 8. **诊断与调试工具** - 静态分析器:/analyze - 运行时检测:AddressSanitizer(/fsanitize=address) - 性能剖析:VS Performance Profiler 9. **生态系统集成** - NuGet包管理 - vcpkg第三方库支持 - Windows Subsystem for Linux(WSL)交叉编译 建议开发者在选择时评估: - 项目对Windows平台特性的依赖程度 - 团队已有工具链的熟悉度 - 对C++最新标准特性的需求 - 跨平台部署需求 实际应用中常出现的问题包括: - Unicode编码设置(需使用`_TCHAR`宏) - 运行时库选择(/MT vs /MD) - Windows版本兼容性设置(/subsystem选项) 可通过`cl /?`查看完整编译选项,建议优先使用Visual Studio IDE进行项目管理以降低配置复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值