工作中经常用命令行在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