2013-02-12 134 views
4

在學校學習C++時,我們從來沒有真正談過如何建立圖書館,所以對於我的基本理解感到抱歉。 從我在線閱讀的內容來看,它好像是一個庫,它只是一個已經編譯好的代碼的集合,然後有一個文件列出了該庫中可以訪問的功能。帶類的圖書館如何工作?

例如當我#include <cmath>我現在可以調用sin(x)而無需訪問cmath代碼來編譯它。我的問題是,這是否適用於有數據的類。

所以我可以創建一個圖書館

//AccumulatorLibrary.h 
class Accumulator 
{ 
public: 
    int num; 
    int increment() {num++}; 
    void otherFunctions(); //otherFunctions defined in the .lib file 
} 

然後調用它

//Main 
#include "AccumulatorLibrary.h" 
#include <stdio> 
int main() 
{ 
    Accumulator A(0); //initalize num to 0 
    Accumulator B(7); //initalize num to 7 
    cout<<A.increment; 
    cout<<B.increment; 
    cout<<A.increment; 
} 

,並得到1 8 2輸出?總之,如果我弄清楚如何將一堆類放入庫文件中,只要該數據在.h文件中具有訪問功能,我可以訪問我想要的任何數據嗎?

或者一個更基本的問題,做一個.h.lib文件工作完全一樣的普通c + +代碼,除非它不必編譯時使用它,你沒有訪問代碼.lib文件?

+2

總之,是的。庫文件基本上是一個目標文件的集合,並且當您「正常」生成程序時鏈接目標文件。圖書館的工作方式完全相同。 – 2013-02-12 19:53:54

+1

你在代碼中有許多錯誤,最好是使用編譯器來驗證我們的想法... – CapelliC 2013-02-12 19:54:04

+0

雅,抱歉。我意識到代碼不會運行,我只是想輸入足夠的信息,希望能夠解決問題。 – user1860611 2013-02-12 20:00:12

回答

5

從我在線閱讀的內容看來,庫似乎只是已經編譯好的代碼的集合,然後有一個.h文件列出了該庫中可訪問的功能。

正確。

我的問題是這是否適用於有數據的類。

它的確如此。許多C++庫公開類並將其代碼預編譯到庫中。

或者一個更基本的問題,做了.H和.LIB文件的工作完全一樣,常規的C++不同的是它沒有當你用它來編譯代碼...

等等,等等。 .h文件仍然包含C++代碼(聲明,有時甚至是內聯實現)。 .lib文件是動態鏈接庫。它們是C++源文件編譯(和鏈接)的結果。

...並且您無權訪問.lib文件中的代碼?

您確實可以訪問它:使用反彙編程序打開它。它只是不再是C++了。

+0

我不會考慮ASM「訪問代碼」。 – 2013-02-12 21:30:23

+1

@MooingDuck好吧,熟練的逆向工程師(我同意,同時我不是一個熟練的逆向工程師)。詢問你當地pentest組的廚師,看看他的迴應;-) – 2013-02-12 21:32:29

+0

但這不是「代碼」,這是「不同的代碼,做同樣的事情」 – 2013-02-12 21:33:06

1

從我在線閱讀,它看起來像一個圖書館只是一個 集合的代碼已編譯

是,也不是。對於我來說,「庫」是一個代碼體(一個或多個頭文件(.h)文件和零個,一個或多個源文件)(.cpp)文件),沒有main()函數,可以獨立編譯和鏈接(除了main()

庫可以通過各種機制可用:

  • 提供了源:在這裏,你必須與你的應用程序一起編譯庫的例子是C++標準模板庫,升壓。 C++庫,您或您的同事的圖書館寫了一個從sourceforge等下載的庫(注意:有時基於源代碼的庫可以作爲編譯優化在系統中預編譯)。

    請注意,作爲源代碼可供您閱讀,但不一定會修改它。

  • 以二進制形式提供:在此處,庫已經編譯好,可能在您的系統中可用。例如C標準庫,C++標準庫,C數學庫等。從這個問題來看,這聽起來像是你所指的那個。

然後有一個.h文件中,列出哪些功能是 該庫訪問。

確實如此,C庫就是這種情況。對於C++來說,這個概念自然延伸到包含類和(公共)成員函數。

總之,如果我想出如何把一堆類成 庫文件,我可以訪問我想要的任何數據,只要該數據具有 在.h文件的訪問功能?

是的!

或者一個更基本的問題,做了.H和普通C++不同的是它沒有代碼的.lib文件的工作完全一樣 時 你用它來進行編譯,而你沒有有權訪問.lib文件中的代碼?

一個庫遵循C++的相同規則,唯一不同之處在於它沒有main()函數。

是否需要編譯取決於它可用的方式(請參見上文)。

對於很多庫,您可以訪問源代碼(參見上文)。

以下爲您例如全碼:

// AccumulatorLibrary.h 
class Accumulator { 
    public: 
    Accumulator(int x) : num(x) {} // ctor with initializer 
    int increment() {num++}; 
    int get() const; 
    void set(int x); 
    private: 
    int num; 
}; 
// AccumulatorLibrary.cpp 
int Accumulator::get() const { return num; } 
int Accumulator::set(int x) { num = x; } 

// Usercode.cpp 
#include "AccumulatorLibrary.h" 
#include <iostream> 
using namespace std; 
int main() { 
    Accumulator A(0); //initalize num to 0 
    Accumulator B(7); //initalize num to 7 

    A.increment(); 
    cout << A.get() << endl;  // print 1 

    B.increment(); 
    cout << B.get() << endl;  // print 8 

    A.increment(); 
    cout << A.get() << endl;  // print 2 
}