在dos下利用cl命令编译cpp时,容易出现问题。下面介绍解决方案:
1.在“我的电脑--属性--高级--环境变量”中,添加如下变量:
INCLUDE
D:\ProgramFiles\MicrosoftVisualStudio\VC98\Include
LIB
D:\ProgramFiles\MicrosoftVisualStudio\VC98\Lib
X:\ProgramFiles\MicrosoftVisualStudio\Common\MSDev98\Bin;X:\ProgramFiles\MicrosoftVisualStudio\VC98\Bin
X表示安装盘符,注意这里是两个路径,因为cl.exe要用到MSDev98\Bin目录下的MSPDB60.DLL。
如果已经存在这些变量,则把以上值分别加在对应的变量值的后面,注意在添加前用分号隔开。
2.重启电脑
3.打开命令提示符,输入:
clhello.c
回车后就会在目录下生成hello.exe和hello.obj。
再来一个更具代表性的例子
1.分别建三个源文件
#include<Stdio.h>
externvoidfunction1(),function2();
intmain(void)
{
function1();
function2();
getch();
return0;
}
voidfunction1()
{
printf("function1");
}
voidfunction2()
{
printf("function2");
}
2.编译文件
运行cmd
clprog.c换行
clprog1.c换行
clprog2.c换行
3.链接文件
linkprog.obj,prog1.obj,prog2.obj
双击prog.exe,最后的输出结果:function1function2
CL.exe是控制MicrosoftC和C++编译器与链接器的32位工具。编译器产生通用对象文件格式(COFF)对象(.obj)文件。链接器产生可执行文件(.exe)或动态链接库文件(DLL)。
注意,所有编译器选项都区分大小写。
若要编译但不链接,请使用/c。
使用NMAKE生成输出文件。
使用BSCMAKE支持类浏览。
以下是一个完整的编译器选项分类列表。
优化
选项作用
/O1创建小代码
/O2创建快速代码
/Oa假设没有别名
/Ob控制内联展开
/Od禁用优化
/Og使用全局优化
/Oi生成内部函数
/Op改善浮点数一致性
/Os代码大小优先
/Ot代码速度优先
/Ow假定在函数调用中使用别名
/Ox使用最大优化(/Ob1gity/Gs)
/Oy省略框架指针
代码生成
选项作用
/clr启用C++的托管扩展并产生在公共语言运行库上运行的输出文件
/EH指定异常处理模型
/G3优化代码以优选386处理器。在VisualC++5.0中已经停用,编译器将忽略此选项
/G4优化代码以优选486处理器。在VisualC++5.0中已经停用,编译器将忽略此选项
/G5优化代码以优选Pentium
/GB与/G6等效;将_M_IX86的值设置为600
/Gd使用__cdecl调用约定
/Ge激活堆栈探测
/GF
/GF启用字符串池
/GH调用挂钩函数_penter
/GH调用挂钩函数_pexit
/GL启用全程序优化
/Gm启用最小重新生成
/Gr启用运行时类型信息(RTTI)
/Gr使用__fastcall调用约定
/GS控制堆栈探测
/GT支持使用静态线程本地存储区分配的数据的纤程安全
/GX启用同步异常处理
/Gy启用函数级链接
/GZ使用__stdcall调用约定
/MD使用MSVCRT.lib创建多线程DLL
/MDd使用MSVCRTD.lib创建调试多线程DLL
/ML使用LIBC.lib创建单线程可执行文件
/MLd使用LIBCD.lib创建调试单线程可执行文件
/MT使用LIBCMT.lib创建多线程可执行文件
/MTd使用LIBCMTD.lib创建调试多线程可执行文件
输出文件
选项作用
/FA
/FA创建列表文件
设置列表文件名
/Fd重命名程序数据库文件
/Fe重命名可执行文件
/Fm创建映射文件
/Fo创建对象文件
/Fp指定预编译头文件名
/FR
/FR生成浏览器文件
/Fx将插入的代码与源文件合并
调试
选项作用
/GS缓冲区安全检查
/GZ与/RTC1相同
/RTC启用运行时错误检查
/Wp64检测64位可移植性问题
/Yd将完整的调试信息放在所有对象文件中
/Yl创建调试库时插入PCH引用
/Z7生成与C7.0兼容的调试信息
/Zd生成行号
/Zi生成完整的调试信息
预处理器
选项作用
/AI指定在解析传递到#using指令的文件引用时搜索的目录
/c在预处理期间保留注释
/D定义常数和宏
/E将预处理器输出复制到标准输出
/EP将预处理器输出复制到标准输出
/Fl预处理指定的包含文件
/FU强制使用文件名,就像它已被传递到#using指令一样
/I在目录中搜索包含文件
/P将预处理器输出写入文件
/U移除预定义宏
/U移除所有的预定义宏
/X忽略标准包含目录
/ZI将调试信息包含在与“编辑并继续”兼容的程序数据库中
语言
选项作用
/noBool取消C++bool、true和false关键字
/vd取消或启用隐藏的vtordisp类成员
/vmb对指向成员的指针使用最佳的基
/vmg对指向成员的指针使用完全一般性
/vmm声明多重继承
/vms声明单一继承
/vmv声明虚拟继承
/Za禁用语言扩展
/Zc在/Ze下指定标准行为
/Ze启用语言扩展
/Zg生成函数原型
/Zl从.obj文件中移除默认库名
/Zpn封装结构成员
/Zs只检查语法
链接
选项作用
/F设置堆栈大小
/LD创建动态链接库
/LDd创建调试动态链接库
/link将指定的选项传递给LINK
/MD使用MSVCRT.lib编译以创建多线程DLL
/MDd使用MSVCRTD.lib编译以创建调试多线程DLL
/ML使用LIBC.lib编译以创建单线程可执行文件
/MLd使用LIBCD.lib编译以创建调试单线程可执行文件
/MT使用LIBCMT.lib编译以创建多线程可执行文件
/MTd使用LIBCMTD.lib编译以创建调试多线程可执行文件
预编译头
选项作用
/Y-忽略当前生成中的所有其他预编译头编译器选项
/Yc创建预编译头文件
/Yd将完整的调试信息放在所有对象文件中
/Yu在生成期间使用预编译头文件
/YX自动处理预编译头
杂项
选项作用
@指定响应文件
/?列出编译器选项
/c编译但不链接
/H限制外部(公共)名称的长度
/HELP列出编译器选项
/J更改默认的char类型
/NOLOGO取消显示登录版权标志
/QI0f确保Pentium0F指令没有问题
/QIfdivFDIV、FPREM、FPTAN和FPATAN指令有缺陷的IntelPentium微处理器的变通方法
QIfist当需要从浮点类型转换为整型时取消Helper函数_ftol的调用
/showIncludes在编译期间显示所有包含文件的列表
/Tc
/Tc指定C源文件
/Tp
/Tp指定C++源文件
/V设置版本字符串
/w设置警告等级
/w禁用所有警告
/Wall启用所有警告,包括默认情况下禁用的警告
/WL在从命令行编译C++源代码时启用错误信息和警告消息的单行诊断
/Zm设置编译器的内存分配限制
CL命令行使用下列语法:
CL[option...]file...[option|file]...[lib...][@command-file][/linklink-opt...]
下表说明CL命令的输入项意义
option一个或多个CL选项。请注意,所有选项都应用于所有指定的源文件。选项是由一个正斜杠(/)或一个短划线(–)指定的。如果某个选项带有参数,则该选项的说明指定在选项和参数之间是否允许有空格。选项名(/HELP选项除外)区分大小写。有关更多信息,请参阅CL选项的顺序。
file一个或多个源文件、.obj文件或库的名称。CL编译源文件并将.obj文件和库的名称传递给链接器。有关更多信息,请参阅CL文件名语法。
lib一个或多个库名。CL将这些名称传递给链接器。
command-file包含多个选项和文件名的文件。有关更多信息,请参阅CL命令文件。
link-opt一个或多个链接器选项。CL将这些选项传递给链接器。
您可以指定任意数目的选项、文件名和库名,条件是命令行上的字符数不超过1024,该限制是操作系统指定的。