這些東西算是編寫C++大型軟件在處理互相之間的依賴關係,或者編譯開源庫的時候會常常用到的知識,有時候常常會遇到一些讓人崩潰的連接錯誤,好比 error LNK 201 205 等等,每每是配置不對引發的。在《Game Engine Architecture》中也專門花了一個章節講這些事情,所以寫下來僅供之後參考。多線程
咱們都知道C++ 編譯過以後會生成目標文件 也就是.obj 或者.o格式的文件。目標文件就是編譯器翻譯過的機器代碼,可是目標文件並不能被機器執行,由於其內部的內存地址並無被肯定,同時全部的外部符號沒有被解釋(也就是沒有鏈接) 而靜態庫lib就是obj文件的打包,linker用lib生成能夠執行的exe文件的過程就是靜態連接,這過程當中要乾的也就是兩件事,肯定內存的最終相對地址,解釋全部的外部符號。函數
而DLL是介於lib和exe之間的一種文件,能夠像lib同樣當成庫使用,也能夠單獨被操做系統調用 和exe同樣。經過DLL動態鏈接生成的exe包含部分已經徹底解釋的代碼,可是全部的外部函數都是須要DLL自己才能解釋的,這就是爲啥常常看到一個程序缺乏xxxDLL沒法運行的緣由。操作系統
在VS或者CMake裏能夠指定工程的生成方式,大部分第三方的開源庫是編譯成lib的,這樣能夠方便本身開發的程序運行,不須要拷貝不少DLL。線程
/MT和/MD 是關於多線程代碼生成的一個選項,若是第三方庫lib的生成和引用了這些庫的工程生成方式不一致的話就會形成linker錯誤,由於/MT (多線程)和/MD(多線程DLL) 使用的分別是MSVCRT.lib 和 LIBCMT.lib 同時使用就會形成linker對兩個lib中的同名函數分不清楚。翻譯