序言
小学期软件编程实践笔记 (:
-
IDE工具
- VSCode
- 语法检测:头文件(include 头文件)+编译内置的语法
- 添加头文件检测 ctrl + shift + p -> C++配置编辑:添加头文件所在目录;
- VSCode
-
控制终端
- 命令
- 环境变量
- PATH: echo %PATH%
- set指令显示所有环境变量
- PATH:Windows 执行程序的搜索的路径,每个路径使用
;
分号分隔
-
VisualStudio 开发环境的设置
- 使用脚本的文件来设置,脚本是vcvars64.bat
- 设置vcvars64.bat 的目录到PATH环境变量;
PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build
set path=%path%;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build
- 使用可视化设置环境变量,需要重启终端;
-
开发工具
- cl 编译器
- link 连接器(PE格式)
- lib 库归档工具(静态库:目标文件的归档)
- dumpbin PE与目标文件格式分析工具
1. 工程组织与编译器
-
编译器
cl 源代码
编译/链接为执行文件/EHsc
异常处理/MD
/utf-8
/source-charset:utf-8
/execution-charset:utf-8
- 头文件目录
-
说明:
- 第一次你输出,汉子可能是乱码
- 使用chcp命令改变终端的代码页,utf-8的code page= 65001
chcp 65001
- 在区域/语言中直接设置编码(整个系统设置为utf-8)
- opencv不识别中文目录;(系统设置编码)
- 使用chcp命令改变终端的代码页,utf-8的code page= 65001
- 第一次你输出,汉子可能是乱码
-
链接器
- link
- cl 负责编译 :检测语法,生成目标文件
- link负责链接 : 负责生成PE格式文件,需要信息动态库信息
- link 选项 目标文件s
/out
/MACHINE:X64
- 第三方的库的库目录
- 第三方的库名
- link
3.静态库
- 前提:lib/dll这两个文件解释清楚;
- lib:静态库
- dll:动态库
3.1.实现一个库函数
gk_math.h
#ifndef GK_MATH_H
#define GK_MATH_H
extern int gk_add(int, int);
#endif
gk_math.cpp
#include "gk_math.h"
int gk_add(int p1, int p2)
{
return p1 + p2;
}
3.2.编译成静态库
@rem 静态库的编译
@rem 编译
cl /c /EHsc /MD /nologo /source-charset:utf-8 /execution-charset:utf-8 /Fo:gkmath.obj gk_math.cpp
@rem 静态库链接
lib /MACHINE:X64 /nologo /OUT:gkmath.lib gkmath.obj
3.3.代码的组织
-
使用shell脚本或者bat处理脚本,比较麻烦的是多个操作的需要写成多个bat文件;实际引入一个专门的工程组织脚本Makefile
-
工程组织的方式:
- 通用
- Makefile
- Cmake
- QMake
- 个性化:
- Visual Studio
- Qt Creator
- QMake
- Eclipse C++
- C++ Builder
- 通用
-
Makefile脚本的语法; Makefile
- 定义变量
- 任务(Task)
- 依赖(任务依赖另外一个任务)
- 指令
-
Makefile例子
CL_FLAG = /c \
/EHsc \
/MD \
/nologo \
/source-charset:utf-8 \
/execution-charset:utf-8
LINK_FLAGS = /MACHINE:X64 \
/nologo
OBJS = gkmath.obj
SOURCES = gk_math.cpp
TARGETS = gkmath.lib
main:$(TARGETS) main.cpp
@ cl /nologo /MD /Fe:main.exe main.cpp $(TARGETS)
$(TARGETS):$(OBJS)
@lib $(LINK_FLAGS) /OUT:$(TARGETS) $(OBJS)
$(OBJS): gk_math.h gk_math.cpp
@cl $(CL_FLAG) /Fo:$(OBJS) $(SOURCES)
clean:
del *.exe *.obj *.lib 2>/Nul
3.4.使用静态库
- 在链接的时候使用静态库
#include <stdio.h>
#include "gk_math.h"
int main(int argc, char **argv, char **arge)
{
printf("C++程序编程! 静态库调用结果:%d\n", gk_add(45, 55));
return 0;
}
- 编译脚本
CL_FLAG = /c \
/EHsc \
/MD \
/nologo \
/source-charset:utf-8 \
/execution-charset:utf-8
LINK_FLAGS = /MACHINE:X64 \
/nologo
OBJS = gkmath.obj
SOURCES = gk_math.cpp
TARGETS = gkmath.lib
main:$(TARGETS) main.cpp
@ cl /nologo /MD /Fe:main.exe main.cpp $(TARGETS)
$(TARGETS):$(OBJS)
@lib $(LINK_FLAGS) /OUT:$(TARGETS) $(OBJS)
$(OBJS): gk_math.h gk_math.cpp
@cl $(CL_FLAG) /Fo:$(OBJS) $(SOURCES)
clean:
del *.exe *.obj *.lib 2>/Nul
- 在代码中使用静态库
#include <stdio.h>
#include "gk_math.h"
#pragma comment(lib, "gkmath.lib")
int main(int argc, char **argv, char **arge)
{
printf("C++程序编程! 静态库调用结果:%d\n", gk_add(45, 55));
return 0;
}
// cl /nologo /MD /Fe:main.exe main_lib.cpp
- 编译命令
cl /nologo /MD /Fe:main.exe main_lib.cpp