軟件編程實訓 Day01學習筆記
先記錄一下,只學會了用Markdown發博客
序言
-
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