VS相关编译命令

  工作中经常用命令行在windows下编译C程序,MinGW(tdm64-gcc)用着也还比较顺手,但是对于Visual Studio编译出来的静态库*.lib文件,gcc调用起来比较麻烦,所以这里研究了一下Visual Studio的命令行工具,也就是Visual Studio 2017 生成工具(下载地址);下载后可以直接安装,也可以导出离线安装包进行离线安装,用vs_buildtools.exe --layout E:\download\vs命令导出离线安装包,大小10G.具体使用可以参见微软官方文档.这里对常用的功能进行举例.

编译环境配置

相关环境配置脚本位于安装路径\VC\Auxiliary\Build

vcvars32.bat使用 32 位 x86 本机工具来生成 32 位 x86 代码;
vcvars64.bat使用 64 位 x64 本机工具来生成 64 位 x64 代码;
vcvarsx86_amd64.bat使用 32 位 x86 本机跨工具来生成 64 位 x64 代码;
vcvarsamd64_x86.bat使用 64 位 x64 本机跨工具来生成 32 位 x86 代码;

编译器CL.exe

CL.exe 在成功(无错误)时返回零;否则返回非零值.
编译链接HelloWorld.c,在默认的用户目录生成HelloWorld.obj和HelloWorld.exe

CL E:\code\c_code\HelloWorld.c

只编译不链接,输出HelloWorld .obj到默认的用户目录

CL /c E:\code\c_code\HelloWorld.c

几个重要编译器选项

/D 相当于#define TEST,注意 /D和TEST之间没有空格,或者用:,也可以有  /DTEST=1
CL /DTEST E:\code\c_code\HelloWorld.c

/E预处理到标准输出stdout
CL /E  E:\code\c_code\HelloWorld.c

/P预处理到默认文件 HelloWorld .i
CL /P  E:\code\c_code\HelloWorld.c

/Fi预处理输出到对应位置,注意 /Fi和后面的路径之间没有空格,但是可以用冒号分开
CL /P  E:\code\c_code\HelloWorld.c /FiE:\code\c_code\HelloWorld.i

/Fo重命名obj文件,注意 /Fo和后面的路径之间没有空格 ,但是可以用冒号分开
CL /c E:\code\c_code\HelloWorld.c /FoE:\code\c_code\HelloWorld.obj

/Fo控制obj文件, /Fe控制exe文件
CL E:\code\c_code\HelloWorld.c /FeE:\code\c_code\HelloWorld.exe

/I 需要包含的目录

/O1  1级优化

/O2  2级优化,最高级别的优化,没有O3优化

/Od  禁用优化

链接器LINK.exe

链接 HelloWorld.obj生成 HelloWorld.exe到默认目录

LINK E:\code\c_code\HelloWorld.obj

链接 HelloWorld.obj生成 HelloWorld.exe到对应目录

LINK E:\code\c_code\HelloWorld.obj /out:E:\code\c_code\HelloWorld.exe

库管理器LIB.exe

LIB.exe主要用于生成.*.lib静态库.
将HelloWorldLib.c编译成HelloWorldLib.lib,需要分为2步:

  • 第一步编译成HelloWorldLib.obj
CL /c E:\code\c_code\HelloWorldLib.c /Fo: E:\code\c_code\HelloWorldLib.obj
  • 第二步生成HelloWorldLib.lib
LIB E:\code\c_code\HelloWorldLib.obj /out:E:\code\c_code\HelloWorldLib.lib

在链接过程中链接静态库

LINK E:\code\c_code\HelloWorld.obj E:\code\c_code\HelloWorldLib.lib /out:E:\code\c_code\Hello.exe

推荐阅读更多精彩内容