2011-12-07 73 views
3

1.是共享图书馆和动态图书馆是一样的东西吗?
窗户只是将它们标记为.dll,而linux将它们标记为.so简单图书馆问题(C++)

2.如果共享库文件包含程序使用的大量函数,何时将这些函数加载到内存中?
在程序开始时?当特定的功能被实际调用?

如果我作出这样一个图书馆:未使用

#ifndef SHARED_H 
#define SHARED_H 

#include <iostream> 
#include <string> 

namespace shared 
{ 
    void Function1(void); 
    void Function2(void); 
    void Function3(void); 
    void Function4(void); 
    void Function5(void); 
    void Function6(void); 
    ... 
    void Function99(void); 
    void Function100(void); 
    ... 
} 
//assume none of these functions call each other 

#endif 

和我的客户端程序仅调用这些功能之一,将他们的是性能降低,因为所有其他额外的功能?
并不担心编译时间..只是实际运行时间

4.是问题3的情况不同,如果我使用一个类:

#ifndef SHARED_H 
#define SHARED_H 

#include <iostream> 
#include <string> 

class Shared 
{ 
    public: 
    void Function1(void); 
    void Function2(void); 
    void Function3(void); 
    void Function4(void); 
    void Function5(void); 
    void Function6(void); 
    ... 
    void Function99(void); 
    void Function100(void); 
    ... 
    private: 
    protected: 
}; 
//assume none of these functions call each other 

#endif 

5.我要使用制作大量对象(.o文件),然后将它们链接在一起制作我的可执行文件。 将我的所有对象(通常是类)转换为.so文件然后将它们链接在一起会更好吗?
我知道可执行文件将依赖于.so文件,与编译后可以删除对象的第一种方法不同,但是对此有何建议?

6.我有点在黑暗中约-fPIC之间-fpic
我听说-fPIC总会工作,并-fpic是目标相关的差异。
目标依赖意味着什么?如果库总是要在同一台机器上编译和使用,我可以安全地使用-fpic吗?

其中一些问题可能是微不足道的,但我想确定 有关我迄今阅读过的内容。我明白任何和 所有响应
*如果相关:使用gcc 4.6.1(Ubuntu的/ Linaro的4.6.1-9ubuntu3)

+2

如果你有多个问题,你应该单独发布。 – Pubby

回答

2
  1. 下盘赢,dll's是动态链接库,这意味着他们得到在运行时单独加载到内存中,而不像在编译期间嵌入模块中的静态链接库(lib's)。

  2. 在Win下,程序启动之前。如果找不到需要的dll,它会报告错误信息并退出。这是除非你动态地尝试调用函数,而不是实际链接到库,通过LoadLibraryGetProcAddress

  3. No.加载库时,函数在内存中有一个众所周知的地方。无论有多少函数,每个函数调用只有一个指令jmpcall

  4. 也没有。很可能这些函数将被表示为非成员函数,它们将this作为额外参数。

  5. 主要原因是重用性。如果您有一个包含多个目标文件的功能独立的模块,那么也可以将它们组合在一起。这样,您可以更轻松地重新使用它,因为您只需链接到一个库而不是多个对象文件。

  6. ???

6

对于第一和第二的问题:作为component.As一个线程可以被视为光工艺 在Windows XP中的线程有DLL的(动态链接库)。 (运行时间)。我猜dll和.so是类似的(可能存在变化,不确定)

外部库通常以两种形式提供:静态库 和共享库。静态库是'.a'文件。当 程序与静态库链接时,程序使用的任何外部函数的 目标文件的机器代码将从库中的 复制到最终的可执行文件中。

针对共享库链接的可执行文件仅包含其所需功能的小型表,而不包含来自外部函数的目标文件的完整机器代码 。在可执行文件 开始运行之前,外部函数的机器代码被操作系统-d 从磁盘上的共享库文件复制到 内存过程称为动态链接。动态链接使可执行文件变小并保存磁盘空间,因为一个库的副本可以在多个程序之间共享。

对于第三问题:因为共享库只有功能表被载入不到哪助记符在编译time.Which加载的代码,所以我们要保存的数据与静态库实际助记符可以从上面的解释中推断出来。

为5问题:我认为这将是更好地使他们作为“所以”只有当你知道你要这些功能rarely.if你要经常使用这些功能,然后让这些功能包含lib作为static.As在运行时提取它们会增加响应时间。