4

在学校学习 C++ 时,我们从来没有真正谈论过如何构建库,所以对我的初步理解感到抱歉。从我在网上阅读的内容来看,库似乎只是已经编译的代码集合,然后有一个.h文件列出了该库中可以访问的函数。

例如,当我#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文件中具有访问功能?

或者一个更基本的问题,a .hand .libfile 的工作方式是否与常规 c++ 代码完全相同,只是在使用时不必编译它,并且您无权访问文件中的代码.lib

4

2 回答 2

5

从我在线阅读的内容来看,库似乎只是已经编译的代码集合,然后有一个 .h 文件列出了该库中可以访问的函数。

正确的。

我的问题是这是否适用于其中包含数据的类。

确实如此。许多 C++ 库都公开了类并将其代码预编译在库中。

或者一个更基本的问题,.h 和 .lib 文件的工作方式与常规 c++ 代码完全相同,只是在使用时不必编译它......

等等。.h 文件仍然包含 C++ 代码(声明,有时甚至是内联实现)。.lib 文件是动态链接库。它们是 C++ 源文件编译(和链接)的结果。

...并且您无权访问 .lib 文件中的代码?

您确实可以访问它:使用反汇编程序打开它。它不再是 C++ 了。

于 2013-02-12T19:54:49.183 回答
1

从我在网上阅读的内容来看,库似乎只是已经编译的代码集合

是和不是。

对我来说,“库”是一段代码(一个或多个头文件(.h)文件和零个、一个或多个源 ( .cpp) 文件),没有main()函数,可以独立编译和链接(除了main())。

一个库可能有多种机制可用:

  • 可作为源:在这里,您必须将库与您的应用程序一起编译。示例有 C++ 标准模板库、Boost C++ 库、您或您的同事编写的库、您从 sourceforge 下载的库等。(警告:有时基于源的库可以在系统中预编译作为编译优化。 )

    请注意,作为源可用意味着您可以阅读它,但不一定要修改它。

  • 以二进制形式提供:在这里,库已经编译并且可能在您的系统中可用。示例是 C 标准库、C++ 标准库、C 数学库等。从问题来看,听起来这就是您所指的那个。

然后有一个 .h 文件,其中列出了该库中可以访问的函数。

没错,C 库就是这种情况。对于 C++,这个概念自然地扩展到包括类和(公共)成员函数。

总之,如果我弄清楚如何将一堆类放入库文件中,我是否可以访问我想要的任何数据,只要该数据在 .h 文件中具有访问功能?

是的!

或者更基本的问题,.h 和 .lib 文件的工作方式与常规 c++ 代码完全相同,只是在使用时不必编译它,而且您无权访问 .h 和 .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
}
于 2013-02-12T20:29:37.730 回答