简单的图书馆问题(C)

1.共享库和动态库是否完全相同?
windows只是将它们标记为.dll,linux将它们标记为.so?

2.如果共享库具有程序使用的大量函数,那么这些函数何时加载到内存中?
在计划开始时?什么时候实际调用特定的函数?

3.如果我创建这样的库:

#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

我用来制作很多对象(.o文件),然后将它们链接在一起制作我的可执行文件.
将所有对象(通常是类)转换为.so文件然后将它们链接在一起会更好吗?
我知道可执行文件将依赖于.so文件,不像第一种方法可以在编译后删除对象,但对此有何推荐?

6.关于-fPIC和-fpic之间的区别,我有点不知所措
我听说-fPIC将始终有效,-fpic依赖于目标.
目标依赖意味着什么?如果库总是要在同一台机器上编译和使用,我可以安全地使用-fpic吗?

some of these questions may be trivial, but I want to be certain
about the things I’ve read so far. I appreciate any and
all responses
*If relevant: using gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

解决方法:

>在Win下,dll是动态链接库,这意味着它们在运行时单独加载到内存中,而不像编译期间嵌入模块中的静态链接库(lib).
>在Win下,程序开始之前.如果找不到它需要的dll,它将报告错误消息并退出.除非你通过LoadLibrary和GetProcAddress动态尝试调用函数而不实际链接到库,否则这是不可能的.
>否.当加载库时,函数在内存中有一个众所周知的位置.无论函数有多少,每个函数调用只有一个jmp或call指令.
>也没有.很可能这些函数将表示为非成员函数,将其作为额外参数.
>主要原因是可重复使用.如果您有一个包含多个目标文件的功能独立模块,您也可以将它们组合在一起.这样您就可以更轻松地重复使用它,因为您只链接到一个库而不是多个目标文件.
> ???

上一篇:c – 静态库


下一篇:社交网络应用程序的Java库