如何实例化库类

时间:2012-01-20 20:35:32

标签: c++ dynamic-linking static-linking

我将问问它是如何在c ++中完成的,但这个想法可以适用于多种语言。如果您也知道如何在objective-c中执行此操作,请提供两者之间的任何相似之处

假设我想要创建ofstream的实例

ofstream myfile;

我假设我的计算机上只有* .o文件(在库存档中)和iostream类的* .h文件。如果这部分不属实,请告诉我。我假设这个是我安装的所有内容都是运行时和开发包,而不是源文件。

如何将头文件连接到目标文件,是否有命名方案。它的外观和顺序在哪里。?

为什么这让我感到困惑通常在我想要创建一个类时,我将该类的实现与程序链接起来,那么它现在在哪里以及它现在如何链接文件?

还有一个问题,如果它是静态加载还是动态加载?

提前谢谢你,并且讽刺这是否是一个愚蠢的问题。

3 个答案:

答案 0 :(得分:2)

这不是标准化的,而是取决于实施。我不知道* unix,但我认为它与Windows非常相似。

您可以假设.o个文件与库文件.lib类似。

标头确定了类定义,以便链接器知道库中要查找的内容。

假设你有一个标题:

class A
{
public:
    A();
    void foo();
};

和一个lib文件A.lib

您包含该标题并致电:

A a;
a.foo();

编译器找到bot A()A::foo()的声明。现在它知道必须在库中搜索这些函数。库中的名称是装饰的,并且包含修饰符,但它特定于编译器,因此链接器会在库中导出函数时查找它们。然后它将函数绑定到dll中的特定入口点。

如果动态加载您的意思是使用LoadModule()GetProcAddress()而不是链接,那么概念就非常相似。

答案 1 :(得分:2)

计算机科学101:

  1. 从广义上讲(非常广泛!),有两种“程序”:

    a)解释:每次执行时都会逐行读取程序源 < = * nix shell脚本和DOS .bat文件是“interpeted”

    b)编译:您读取源一次(将其转换为“二进制机器代码”)。您链接机器代码“目标文件”以构建“可执行程序”。

  2. 您在谈论“已编译的程序”

  3. 一旦程序被“编译”,“ofstream”部分就无关紧要了

    “ofstream”的二进制实现可以直接编译到可执行文件中,也可以在运行时从共享库(.dll)动态加载。

  4. “编译器”用户“.h”标题用于处理源文件。

    “链接器”使用“.lib”库来匹配符号并链接链接类型的静态代码。

    “操作系统”识别动态链接并在运行时加载所需的共享库(.dll)。

  5. 三个不同的东西,彼此独立:编译器/源代码,链接器/机器目标代码,OS /可执行程序

    '希望有所帮助... ...

答案 2 :(得分:0)

如果进行静态链接,则.obj文件中提供了所有带链接的符号。链接器将函数的调用绑定到函数的入口点。在此过程中涉及名称管理,以便可以正确解析符号。

动态链接是一个依赖于平台的问题,据我所知,它不是C或C ++标准的一部分。