軟件編程實訓 Day01學習筆記


軟件編程實訓 Day01學習筆記
先記錄一下,只學會了用Markdown發博客

序言

  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.動態庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章