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

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

6. 我对 -fPIC 和 -fpic 之间的区别有点不了解
我听说 -fPIC 将始终有效,而 -fpic 取决于目标。
目标依赖是什么意思?如果库总是要在同一台机器上编译和使用,我可以安全地使用 -fpic 吗?

最佳答案

  • 在 Win 下,dll's 是动态链接库,这意味着它们在运行时单独加载到内存中,这与编译期间嵌入模块中的静态链接库 (lib's) 不同。
  • 在 Win 下,在程序启动之前。如果找不到它需要的dll,它会报告错误信息并退出。除非您通过 LoadLibraryGetProcAddress 动态尝试调用函数而不实际链接库。
  • 否。当加载库时,这些函数在内存中有一个众所周知的位置。无论有多少函数,每个函数调用都只有一个 jmpcall 指令。
  • 也没有。很可能这些函数将被表示为将 this 作为额外参数的非成员函数。
  • 主要原因是可重用性。如果您有一个包含多个目标文件的功能独立的模块,您不妨将它们组合在一起。这样您就可以更轻松地重用它,因为您将只链接到一个库而不是多个目标文件。
  • ???
  • 关于c++ - 简单的库问题 (C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8423918/

    10-10 09:40