以下還是引用我在 C_and_CPP 版用過的比喻
解釋寫在 [] 裡面
※ 引述《Orilla (企鵝 有股無比的魅力)》之銘言:
: 最近在看C
: 有些地方不太懂
: 希望知道的大大們幫解惑一下
: GOOGLE過
: 1.
: header file是說裡面可能有一些常數 函式的架構
: 是不是因為它只是一個骨架 所以還要用.cpp檔去定義實體的運作內容??
header file 像是一個電路元件的說明書
裡面有說什麼元件要用什麼方式留接頭 [什麼函式要用什麼方式呼叫]
函數的實作(.cpp)則是那個元件本身
在各自組裝完成之後再把元件跟接頭焊起來 [連結器的連結功能]
這樣就是一個完整可用的電路了
這些元件都會以功能做為分類, 每個分類就是元件庫
[就是常聽到的 library, 函式庫, .lib 檔案]
要用什麼元件就去什麼元件庫裡找, 當然也要記得查說明書知道怎麼留接頭
[函式庫都有隨附的 header file 表示裡面的函式要如何呼叫]
有的時候所連結的元件是預設就會幫你焊起來的那一包標準元件
[例如 C Runtime Library, 常用數學函式, 等等這些東西]
這時候不用指定也會去那一個元件庫裡找元件
[即是所謂"預先連結的函式庫", VC++ 裡它是以 libc 開頭的 .lib 檔案]
否則必須要指定對應的元件庫, 這樣才找得到正確的元件
[即是在連結器指定連結哪些函式庫的參數]
: 2.
: DLL在撰寫的過程 好像也是要編寫.h檔 然後用.cpp檔去寫裡面的運作內容??
: 然後在寫自己想要的程式時 看到都是要把該DLL的.h include進來才能用該DLL的功能
: 那DLL和header file不就一樣嗎?? 還是我哪邊沒弄懂??
: 還有 如果程式語言不同 為什麼DLL檔可以互相引用??
: 3.
: 查到.lib和DLL檔有關連 但是不懂之間有什麼關聯
: 是說.lib檔是把一堆DLL檔整合在一起嗎??
DLL 就是一包隨插即用的元件庫
它的接頭比較不一樣, 不是用焊的而是做成插頭插上去
[這個"插座"叫做 GetProcAddress, "插頭"則是所謂的 export function]
因此呼叫時需要做出對應的插座才能使用
不過在製作 DLL 時也可以附帶做出公版插座給要用的人自己焊
[這即是你 3. 在問的 .lib 的內容, 裡面就是包含了自動生成的 GetProcAddress]
當然就算是公版插座, 東西還是有一定的焊法
所以當然也會有說明書表示要怎麼焊上這個插座
[即是 .dll 所隨附的 header file]
因此你所焊上去的是這個公版插頭, 實際的元件則是在執行時找出來插上去
[執行時尋找對應的 dll 載入函式]
也因為是執行時才找出來, 所以可以直接把元件包整包換掉 [抽換 dll]
只要插頭還是對的就能夠插上去用
同樣的原因, 用這個元件的人跟元件本身是由不同人以不同方式製作也沒有關係
只要插頭插得上去就行了
[使用者跟 dll 使用不同語言寫作也是沒問題的, 只要 ABI 接口有對上即可]
: 4.
: API網路上有說是一種概念
: 如果自己要撰寫程式 使用API來創造自己想要的功能或取得第三方的資訊
: 是不是只能使用第三方指定的軟體去開發
: 還是說可以用所有的軟體開發 然後用DLL去連結就可以??(第二題的問題之一)
: 謝謝各位了解的大大們不吝惜教導
: 先在這邊感謝
API 是比較高階的概念
它是屬於我的系統要用什麼架構下去運作的設計概念
像是你要用別人設計好的板子
要怎麼去跟板子溝通傳輸資料表示你要做的事情這些就是這塊板子的 API
因此其中的的函式呼叫跟資料結構什麼的都是操作細節
重要的是整個系統的概念
那因為整套系統是綁在一起的, 自然就會將整個系統的函式製作成 lib 或 dll
讓其他人直接把這一整包系統拉進他要寫的東西裡面去
(有些更大一點的系統還會分門別類打包
某些類別的系統包在一個檔案裡, 這樣沒用到這個系統就可以不用拉它進來)
有的系統會提供一些比較方便使用這套系統的人進行開發的工具
但這並不表示你一定要用它的工具進行開發