C/C++學習筆記

來源:互聯網
上載者:User
  • CL.exe
    1. cl /c [filename]   /c為只編譯不連結的意思,預設cl.exe工具會在編譯之後自動調用LINK.EXE進行連結
    2. cl.exe運行需要指定include、lib等環境變數
    3. [filename]需要指定檔案全名(包含尾碼名)
    4. C/C++的編譯是針對檔案進行的
  • lib.exe Microsoft庫管理工具
    用於打包編譯後的庫檔案(obj),使產生一個庫檔案(lib)
    obj檔案和lib檔案一樣,可以直接用於link.exe連結工具中,產生exe可執行檔。lib.exe的作用只是打包,將多個obj打包為一個
  • link.exe 連結工具
    link   /dll選項用來產生一個動態連結程式庫(dll)
  • 庫檔案的編寫:
    庫檔案中只包含需要的函數及資料即可,不需要main函數,也不能有main函數
    庫檔案的調用者,需要用extern關鍵字申明要調用的外部函數
  • 目前以lib尾碼的庫有兩種,一種為靜態連結庫(Static   Libary,以下簡稱“靜態庫”),另一種為動態串連庫(DLL,以下簡稱“動態庫”)的匯入庫(Import   Libary,以下簡稱“匯入庫”)。  
        靜態庫是一個或者多個obj檔案的打包,所以有人乾脆把從obj檔案產生lib的過程稱為Archive,即合并到一起。比如你連結一個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。 
        動態庫一般會有對應的匯入庫,方便程式靜態載入動態連結程式庫,否則你可能就需要自己LoadLibary調入DLL檔案,然後再手工GetProcAddress獲得對應函數了。有了匯入庫,你只需要連結匯入庫後按照標頭檔函數介面的聲明調用函數就可以了。
        匯入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行代碼、符號表等等,而對於匯入庫而言,其實際的執行代碼位於動態庫中,匯入庫只包含了地址符號表等,確保程式找到對應函數的一些基本地址資訊。
  • 動態連結程式庫(dll)
    一般為提高程式可讀性,使用#define DllExport __declspec(dllexport)宏定義Dll中需要匯出的函數;在每個需要匯出的函數前使用DllExport,例如DllExport int multiple(int x,int y)
    產生一個Dll的方法:1.使用cl.exe /c [filename]將源檔案產生庫檔案 2.使用link.exe /dll [filename.obj]將此obj檔案產生dll
    調用Dll的方法一:1. 使用extern指定外部函數名 2.在程式中直接使用將要調用的Dll的函數名 3.連結時加入上一步驟中產生的庫檔案(.lib)
  • 方法二:運行時動態載入
    C程式碼範例:
    //lib.c
    #define DllExport __declspec(dllexport)
    DllExport int multiple(int x,int y)
    {
     return x*y;
    }
    //libCaller.c
    #include "windows.h"
    //extern  int multiple(int x,int y);
    typedef UINT (CALLBACK* LPFNDLLFUNC1)(int,int);
    HINSTANCE hf;
    LPFNDLLFUNC1 func;
    main()
    {
         hf= LoadLibrary("lib.dll");
         if(hf!=0)
         {
              func = (LPFNDLLFUNC1)GetProcAddress(hf,"multiple");
              printf("Multiple:%d\r\n",func(5,12));
              FreeLibrary(hf);
        }
    }
  • Windows中的.lib檔案分兩種類型
    1.靜態庫檔案,用於編譯時間供其他對象引用 2.動態連結程式庫的匯出檔案。連結時使用,無需使用LoadLibrary動態載入。
  • Link.exe工具在使用.def檔案產生DLL時的兩種命令列語句:
    1. 如果DEF檔案中沒有LIBRARY語句,需要同時指定/DEF /DLL選項
    2. 如果DEF檔案中有LIBRARY語句,只需指定/DEF選項即可產生DLL
  • Microsoft Visult Studio開發工具中CL.exe工具CL的意思及Compile和Link
  • 產生DLL的方式(listed in recommended order of use):
    1. 在源檔案中使用VC++自訂關鍵字__declspec(dllexport)
    2. 使用包含EXPORTS語句的.def檔案
    3. 使用Link.exe工具的/EXPORT選項(定義匯出函數)
  • //DEF源檔案Sample
    EXPORTS
    add
  • //DLL源檔案Sample
    int add(int x,int y)
    {
     return x + y;
    }
  • int substract(int x,int y)
    {
     return x-y;
    }
  • 需要說明的是:使用虛函數,系統要有一定的空間開銷。當一個類帶有虛函數時,編譯系統會為該類構造一個虛函數表(virtual function table),簡稱(vtable),它是一個指標數組,存放每個虛函數的入口地址。系統在進行動態關聯時的時間開銷是很少的,因此,多態性是高效的。
  • 封裝:“封裝性”(encapsulation),所謂“封裝”,指兩方面的含義:一是將有關的資料和作業碼封裝在一個對象中,形成一個基本單位,各個對象之間相對獨立,互不干擾。二是將對象中某些部分對外隱蔽,即隱蔽其內部細節,只留下少量介面,以便與外界聯絡,接收外界的訊息。這種對外界隱形做法稱為資訊隱蔽(imformationhiding)。資訊隱蔽還有利於資料安全,防止無關的人瞭解和修改資料。特性:1. 大大降低了操作對象的複雜性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.