【笔记】C++独立MSVC编译配置(命令行+sublime)

前言

一些东西需要VS的编译器,即MSVC。
在配置中碰到哪个文件找不到之类的问题,最好的方法是找你装VS的同学,从他们的VS目录里拷这个文件。
实际上,只有不想装VS的人才需要这篇教程,否则直接装VS用就可以了。

参考资料
C语言编译器CL.exe
GetDC function

原理简介

类似于mingw的gcc.exe,msvc的编译程序叫做 C L . e x e CL.exe CL.exe
msvc的编译过程分为两步。

  1. 编译,使用cl.exe将c或cpp文件编译为obj文件。这个过程中需要INCLUDE
  2. 链接,使用link.exe将obj文件链接为exe文件。
    所以理论上讲,只要有cl.exe和link.exe,即可完成MSVC编译。
    编译命令是cl filename.c,就会自动生成filename.obj和filename.exe。

但是实际上,C/C++程序的编译过程需要与头文件(.h)一起执行,链接过程需要与静态链接库(.lib),动态链接库(.dll)等文件一起执行。所以还必须有这些文件以及配置好它们的路径。下面是具体步骤。

配置步骤

  1. 下载
    下载地址
    下载压缩包,解压到一个能清楚记得又不会随意修改的位置,如D:\Save\Fix\cl
  2. 配置环境变量
    在系统环境变量PATH中,添加值D:\Save\Fix\cl\Bin
    在系统环境变量中(注:非PATH),添加变量Include,值为D:\Save\Fix\cl\Include
    在系统环境变量中,添加变量lib,值为D:\Save\Fix\cl\LIB.
  3. 测试
    打开cmd,切换到D:\Save\Fix\cl\Bin,输入cl hello.c
    再输入hello
    结果应如下图显示
    【笔记】C++独立MSVC编译配置(命令行+sublime)_第1张图片
  4. 安装Windows SDK
    压缩包中自带的include和lib只能满足最基本的需要,我们需要微软的官方支持。
    下载地址https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
    安装完成后的WindowsSDK文件夹里,有include和lib两个目录,将它们的一些子文件添加到对应的环境变量里,完成。
    这是include环境变量
    【笔记】C++独立MSVC编译配置(命令行+sublime)_第2张图片
    这是lib环境变量
    【笔记】C++独立MSVC编译配置(命令行+sublime)_第3张图片
    之后就可以编译大部分程序了。

我遇到的问题

  1. 出现LINK1104错误,提示找不到libc.lib
    保证libc.lib在环境变量Iib中即可,还有问题就将lib目录中的libc.lib复制到bin目录下
  2. 出现LINK2001错误
    提示找不到外部符号GetDC和ReleaseDC。
mmx.obj : error LNK2001: unresolved external symbol __imp__ReleaseDC@8
mmx.obj : error LNK2001: unresolved external symbol __imp__GetDC@4
mmx.exe : fatal error LNK1120: 2 unresolved externals

从微软的官方文档中查阅得到,getDC需要User32.dll和User32.lib的支持。首先保证user32.lib所在目录在环境变量Iib中,然后在编译选项中添加链接选项,得到cl filename.cpp /link user32.lib

其它的LINK2001同理,都可以通过 文档查询依赖项目->下载依赖项目->加入工程选项 解决。

  1. 出现LINK1104错误,提示找不到libcp.lib
    LINK : fatal error LNK1104: cannot open file "libcp.lib"
    注意,这条与第一条的区别是libc后面多了一个p。我在使用时发现的此问题。后来发现是,压缩包中的cl.exe是1998年的版本了,可能不支持现代c++的许多东西,而且在网上也找不到libcp.lib下载。我的程序也不用非用到这些特性,所以就搁置了。
    解决方法应当是从别人有VS的机器上拷贝一个libcp.dll或者直接拷贝cl.exe与link.exe。

sublime环境配置

【笔记】C++独立MSVC编译配置(命令行+sublime)_第4张图片
现在我的cpp有六个编译选项,分别是:

  1. 默认选项,使用c++14,在编译选项中预先定义 _ L I T T L E F A L L _ \_LITTLEFALL\_ _LITTLEFALL_,而且在新打开的CMD窗口中运行。
  2. 不在新打开的命令行中运行,直接在sublime中运行,适用于没有输入且输出较少的程序
  3. 没有预定义 _ L I T T L E F A L L _ \_LITTLEFALL\_ _LITTLEFALL_
  4. 编译后使用gdb打开,但似乎不可用
  5. 使用C语言编译,C99
  6. 使用MSVC编译

配置文件如下,配置方法详见我之前的博客。

{
	"encoding": "utf-8",
	"working_dir": "$file_path",
	"shell_cmd": "g++ -Wall -D _LITTLEFALL_ -std=c++14 \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\"",
	"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
	"selector": "source.c++",
 
	"variants": 
	[
		{	
		"name": "Run in sublime",
        	"shell_cmd": "g++ -Wall -D _LITTLEFALL_ -std=c++14 \"$file_name\" -o \"$file_base_name\" && cmd /c \"${file_path}/${file_base_name}\""
		},
		{	
		"name": "no predefine",
        	"shell_cmd": "g++ -Wall -std=c++14 \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""
		},
		{	
		"name": "gdb Debug",
        	"shell_cmd": "g++ -g -D _LITTLEFALL_ -std=c++14 \"$file\" -o \"$file_base_name\" && start cmd /c gdb ${file_path}/${file_base_name} & pause"
		},
		{	
		"name": "C ",
        	"shell_cmd": "gcc -g -D _LITTLEFALL_ -std=c99 \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""
		},
		{
		"name": "MSVC",
        	"shell_cmd": "cl \"$file\" /link user32.lib gdi32.lib && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""
		}
	]
}

你可能感兴趣的:(学习笔记,精选)