day01笔记

序言


小学期软件编程实践笔记 (:


  1. IDE工具

    • VSCode
      • 语法检测:头文件(include 头文件)+编译内置的语法
      • 添加头文件检测 ctrl + shift + p -> C++配置编辑:添加头文件所在目录;
  2. 控制终端

    • 命令
    • 环境变量
      • PATH: echo %PATH%
      • set指令显示所有环境变量
      • PATH:Windows 执行程序的搜索的路径,每个路径使用;分号分隔
  3. 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
    • 使用可视化设置环境变量,需要重启终端;
  4. 开发工具

    • cl 编译器
    • link 连接器(PE格式)
    • lib 库归档工具(静态库:目标文件的归档)
    • dumpbin PE与目标文件格式分析工具

1. 工程组织与编译器

  1. 编译器

    • cl 源代码 编译/链接为执行文件
      • /EHsc 异常处理
      • /MD
      • /utf-8
        • /source-charset:utf-8
        • /execution-charset:utf-8
      • 头文件目录
  2. 说明:

    • 第一次你输出,汉子可能是乱码
      1. 使用chcp命令改变终端的代码页,utf-8的code page= 65001
        • chcp 65001
      2. 在区域/语言中直接设置编码(整个系统设置为utf-8)
        • opencv不识别中文目录;(系统设置编码)
  3. 链接器

    • link
      • cl 负责编译 :检测语法,生成目标文件
      • link负责链接 : 负责生成PE格式文件,需要信息动态库信息
    • link 选项 目标文件s
      • /out
      • /MACHINE:X64
      • 第三方的库的库目录
      • 第三方的库名

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

    1. 定义变量
    2. 任务(Task)
      • 依赖(任务依赖另外一个任务)
    3. 指令
  • 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.使用静态库

  1. 在链接的时候使用静态库
#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
  1. 在代码中使用静态库
#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

4.动态库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值