Visual Stdio C++ 编译器、链接器常用命令行选项总结

以前使用 Visual Stdio 都是在 IDE 环境下。这两天编译 GSL 感觉用 IDE 环境特别不方便,所以就花了点时间简单学习了如何在命令行下使用 Visual Stdio C++ 编译器、连接器。

我个人对 gcc 还是比较熟悉的,所以这里的各种用法都做了 gcc 的类比,这样也便于记忆。

编译器 CL

Visual Stdio 中的 C/C++ 编译器都是同一个,叫做 CL。下面表格列出了一些基本的命令行选项。

CLgcc说明
/E-E输出预处理结果
/Fa-S输出汇编文件
/Za-ansi禁止语言扩展,这两个还不是等价的
/Dname-Dname定义一个宏,相对于在代码中添加了 #define name
/Dname=value-Dname=value定义一个宏,相对于在代码中添加了 #define name value
/Wall-Wall将所有的警告信息全开。
/Od-O0禁止优化
/O1-Os以最节省空间为目标优化
/O2-O2以允许速度最快为目标优化
/Idirecotry-Idirecotry指定头文件搜索路径
/c-c生成目标文件 .obj, 不链接
/libpath:direcotry-Ldirecotry指定库文件搜索路径(MSVC的/libpath属于链接选项,第一个链接选项之前要指定/link选项,用来告诉编译器驱动,后续选项传给链接器使用)
/GR,/GR--frtti,-fno-rtti开启或关闭RTTI
/link-Wl链接指定的模块或给链接器传递参数
/LD-shared编译产生DLL文件
/LDd编译产生DLL文件(调试版)
/MD与动态多线程版本运行库MSVCRT.LIB链接
/MDd与调试版动态多线程版本运行库MSVCRTD.LIB链接
/MT与静态多线程版本运行库LIBCMT.LIB链接
/MTd与调试版静态多线程版本运行库LIBCMTD.LIB链接

除了这些,还有不少的命令行选项,不过一般用途来说,这些就够用了。

对应 gcc 工具链中的 ld。

linkld说明
/BASE:address指定输出文件的基地址
/DEBUG输出调试模式版本
/DEF:filename指定模块定义文件.DEF
/DEFAULTLIB:library指定默认运行库
/DLL–relocateable产生DLL
/ENTRY:symbol–entry=symbol指定程序入口
/EXPORT:symbol指定某个符号位导出符号
/HEAP指定默认堆大小
/LIBPATH:dir指定链接时库搜索路径
/MAP:MAPFILE-Map MAPFILE产生链接MAP文件
/NODEFAULTLIB禁止默认运行库
/OUT:name-o name指定输出文件名为 name
/STACK指定默认栈大小
/SUBSYSTEM指定子系统,常见选项是 windows 和 console

生成静态库工具 lib

lib 可以将一系列的 obj 文件打包为一个静态库 .lib。也可以将几个 .lib 合成一个 .lib。或者将几个 .obj 和 .lib 合成一个 .lib。

比如我们有 add.obj sub.obj div.lib 这三个文件,我们想将他们合成为一个 all.lib。
那么可以这样:

lib add.obj sub.obj div.lib /out:all.lib

如果要将这三个文件合并为一个 all.dll 那么我们还需要个 .def 文件。里面给出哪些符号要导出。
类似下面这个样子:

LIBRARY   all.dll
EXPORTS
   add
   sub
   div

之后执行 link 命令:

link /SUBSYSTEM:windows /dll /def:all.def /out:all.dll add.obj sub.obj div.lib
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值