如果我在Linux中使用C++創建一個靜態庫以生成「.a」文件,我(或其他人)如何使用該庫?例如,我的庫定義了一個類。我認爲僅僅提供「.a」文件是不夠的,而且還提供了一個頭文件。如何知道必須使用「.a」文件提供哪些頭文件?何時使用靜態庫需要頭文件?
例如,是否需要提供包含在我的庫的代碼中任何位置的所有頭文件?
如果我在Linux中使用C++創建一個靜態庫以生成「.a」文件,我(或其他人)如何使用該庫?例如,我的庫定義了一個類。我認爲僅僅提供「.a」文件是不夠的,而且還提供了一個頭文件。如何知道必須使用「.a」文件提供哪些頭文件?何時使用靜態庫需要頭文件?
例如,是否需要提供包含在我的庫的代碼中任何位置的所有頭文件?
的技術原因,頭文件是爲了讓編譯器知道名和尺寸在編譯用戶代碼,以便它可以安排用戶對象的佈局。
這就是爲什麼公共類private
成員(注意的重點:公共,在這裏,是不是關鍵字)的原因必須在頭文件中暴露出來。
您可以避免將暴露的部分中暴露的類僅暴露爲指針或引用,因爲它們的實例不會留在生成的用戶對象本身中。在這種情況下,你可以聲明這個名字。
你有-in物質─頂部提供給用戶的所有聲明說
如果你想使用一個類,我假設你已經知道該類被調用。在這種情況下,您可以簡單地搜索定義類的標題,並將其包含在內。
How do I know what header files must be provided with the ".a" file?
通常所有描述您希望用戶有權訪問的功能的頭文件。這意味着,答案
do I need to provide all header files that were included anywhere in the code
一般是「不,你不知道」 - 有可能是你不公開內部/私有頭。
頭文件爲類和函數提供「聲明」。這些是編譯器需要的,所以它可以a)驗證你傳遞了正確的參數,和/或設置類/結構的正確數據成員,以及b)因此它可以知道如何調用這些函數。
void do_something(int a, std::string& s);
告訴這個函數需要兩個參數編譯器:一個int
和string&
。這證明您正在傳遞正確類型的參數(一種語言級別的構造),並解釋了編譯庫中的目標代碼期望的內容(兩個參數 - 如何根據調用約定確定)。
如果編譯的庫使用的是其他庫中的代碼,因此不需要必須提供這些頭文件,因爲它們與您編寫的代碼無關。這些庫在「應用程序二進制接口」(ABI)級別上工作,而不是「應用程序編程接口」(API)。這意味着它們只是傳遞指針等。不是C類型的參數。
假設我希望其他人能夠使用的類的其中一個數據成員是在另一個頭文件中定義的類型。在這種情況下,我需要提供兩個頭文件嗎? – synaptik
@synaptik它依賴。如果它是一種私人/內部類型,那麼你不會 - 然後你只是向前 - 宣佈這種類型。如果它是公開的,那麼是的,你也公開這個頭文件。 – 2012-12-16 07:45:43
所以,如果類型是「車輛」(這是一個類),那麼我可以簡單地像這樣轉發聲明:「Class Vehicle;」你是這個意思嗎? – synaptik