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

原创 2016年08月30日 16:44:30

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

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

编译器 CL

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

CL gcc 说明
/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。

link ld 说明
/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
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

VS2015给命令行添加参数

VS2015给命令行添加参数: 右键要添加命令行参数的工程->属性->配置属性->调试,右边有命令行参数输入框,输入即可。argv[0]是程序名,从argv[1]开始是输入的参数。个参数之间用空格进...

VS2015下解决:error LNK2019: 无法解析的外部符号 __iob_func

在使用VS2015下使用libjpeg-turbo静态库,编译时报错了: error LNK2019: 无法解析的外部符号 __iob_func,该符号在函数 output_message 中被引...
  • 10km
  • 10km
  • 2016-01-16 17:15
  • 13615

C编译器、链接器、加载器详解

一、概述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是...
  • zzxian
  • zzxian
  • 2013-11-19 10:54
  • 7311

Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(8)

Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(8)gsl_ieee 模块这个模块缺少对 MSVC 平台的支持。我们需要自己写一个...

VS2013调试时符号加载的问题

正在从以下位置加载xxx.dll的符号

Visual C++ 链接器选项

Visual C++ 链接器选项Visual C++ 链接器选项链接器选项 LINK 是将通用对象文件格式 (COFF) 对象文件和库链接起来以创建可执行 (.exe) 文件或动态链接库 (DLL) ...

VC编译器链接器选项

  • 2010-06-07 09:41
  • 266KB
  • 下载

visual studio编译器和链接器使用的环境变量

cl.exe和link.exe分别是visual studio IDE中的编译器和链接器,就像linux中的gcc编译器会用到环境变量去完成工作(include路径与lib路径等)一样,它们在工作时 ...

C++编译器与链接器工作原理

首先,我们从编译原理开始 一、编译原理概念: 1、编译:编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如...

C++编译器与链接器工作原理

这里并没不是讨论大学课程中所学的《编译原理》,只是写一些我自己对C++编译器及链接器的工作原理的理解和看法吧,以我的水平,还达不到讲解编译原理(这个很复杂,大学时几乎没学明白)。 要明白的几个概念:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)