2013-02-12 96 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 
}