Visual Studio 使用命令行编译 C/C++ 程序

VS 使用命令行编译单个 C/C++ 源文件

在 Windows 系统的开始菜单栏里,找到 Developer Command Prompt for VS 2019 应用程序,双击运行后,在 Command 窗口内执行以下命令来编单个 C/C++ 源文件。值得一提的是,这里需要将以下命令中的 HelloWorld 字符串替换为本地真正的 C/C++ 源文件的文件名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看文件列表
> dir
2021/10/30 16:05 <DIR> .
2021/10/30 16:05 <DIR> ..
2021/10/30 22:15 601 HelloWorld.cpp

# 编译C/C++源文件(cl后面字符的是小写L不是数字1)
> cl HelloWorld.cpp /EHsc

# 查看文件列表,发现成功编译后会多了两个文件
> dir
2021/10/30 16:53 <DIR> .
2021/10/30 16:53 <DIR> ..
2021/10/30 22:15 601 HelloWorld.cpp
2021/10/30 16:53 101,888 HelloWorld.exe
2021/10/30 16:53 1,976 HelloWorld.obj

# 运行编译后的C/C++程序
> HelloWorld 或者 HelloWorld.exe

VS 使用命令行编译多个 C/C++ 源文件

假设项目里有如下的三个 C/C++ 源文件,分别是 Array.hArray.cppmain.cpp,那么编译这几个文件时就可以使用命令:cl main.cpp Array.cpp /EHsc。值得一提的是,编译命令里不需要指定以 .h 作为后缀的文件,只需要指定所有以 .c 或者 .cpp 作为后缀的文件即可。

  • Array.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once

#include <iostream>

using namespace std;

class Array {
public:
Array(int length);

Array(const Array& array);

~Array();

public:
void setData(int index, int value);
int getData(int index);
int length();

private:
int m_length;
int* m_space;
};
  • Array.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "Array.h"

Array::Array(int length) {
cout << "有参构造函数被调用" << endl;
if (length < 0) {
length = 0;
}
this->m_length = length;
this->m_space = new int[length];
}

Array::Array(const Array& array) {
cout << "拷贝构造函数被调用" << endl;
// 深拷贝,单独分配内存空间
this->m_length = array.m_length;
this->m_space = new int[array.m_length];
for (int i = 0; i < array.m_length; i++) {
this->m_space[i] = array.m_space[i];
}
}

Array::~Array() {
cout << "析构函数被调用" << endl;
if (this->m_space != NULL) {
delete[] this->m_space;
this->m_space = NULL;
this->m_length = 0;
}
}

void Array::setData(int index, int value) {
this->m_space[index] = value;
}

int Array::getData(int index) {
return this->m_space[index];
}

int Array::length() {
return this->m_length;
}
  • main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include "Array.h"

using namespace std;

int main() {

// 自动调用构造函数初始化数组
Array array1(5);

// 数组赋值
for (int i = 0; i < array1.length(); i++) {
array1.setData(i, i);
}

// 打印数组
for (int i = 0; i < array1.length(); i++) {
cout << "array1[" << i << "] = " << array1.getData(i) << endl;
}

// 自动调用拷贝构造函数初始化数组(属于深拷贝)
Array array2 = array1;

// 打印数组
for (int i = 0; i < array2.length(); i++) {
cout << "array2[" << i << "] = " << array2.getData(i) << endl;
}

return 0;
}

执行命令编译 C/C++ 程序后,控制台输出的日志信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> cl main.cpp Array.cpp /EHsc

用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.29.30136 版
版权所有(C) Microsoft Corporation。保留所有权利。

main.cpp
Array.cpp
正在生成代码...
Microsoft (R) Incremental Linker Version 14.29.30136.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:main.exe
main.obj
Array.obj

运行编译后的 C/C++ 程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> main

有参构造函数被调用
array1[0] = 0
array1[1] = 1
array1[2] = 2
array1[3] = 3
array1[4] = 4
拷贝构造函数被调用
array2[0] = 0
array2[1] = 1
array2[2] = 2
array2[3] = 3
array2[4] = 4
析构函数被调用
析构函数被调用

参考博客