链接:静态与动态

ali*_*hoo 7 c++ cross-platform dynamic-linking static-linking

在我的申请中,我有3个主要部分:

  • Exe:可执行文件
  • Lib_A:一个库包含一个单例类和一个基类,用于在单例类中使用的一些计算
  • Lib_B:库包含从Lib_A中的基础派生的许多类

我在Lib_B中有派生类的原因是,我想在运行时从Exe编译Lib_B.我需要在计算过程中生成派生类而不终止整个系统.这对我来说太重要了.这意味着最初我可能会说Lib_B1是动态加载的,我也可以将其他版本的Lib_B编译为Lib_B2,Lib_B3,Lib_B4等,并动态加载它们.所有Lib_Bx库都有入口点函数来导出它们中的类.

因此,请考虑以下事实:

  • 在运行时,将有各种数量的文件共享相同的Lib_A.
  • 该应用程序必须在Windows和Linux中运行.因此,部分跨平台性是一个问题.
  • 我将使用一些库,如TBB,Boost,Qt,它们可能有自己的库,如tbb.dll等.

Lib_A与Exe和Lib_Bx的静态或动态链接有哪些优缺点?如何影响性能,系统大小等?除了我需要为Exe,Lib_A和Lib_Bx使用相同编译器的每个OS之外,是否还有任何危险或困难的情况.

整个系统的设计对我来说是一个非常难的问题,所以任何评论都将受到赞赏.

非常感谢.

rot*_*lup 6

根据我对项目描述的理解,您应该动态链接Lib_A:如果将Lib_A静态链接到每个Lib_Bx共享库,则将复制Lib_A代码和静态变量的x倍.

比方说,如果你在Lib_A中有一个类,它有以下形式:

class BaseKlass
{
  static int instance_count;
  ...
};
Run Code Online (Sandbox Code Playgroud)

instance_count将在所有共享库中重复,因此无法BaseKlass计算其实例.

您可能会被虚拟表或RTTI(dynamic_cast)等更微妙的问题所困扰.

你应该看看这个boost.python文档,该文档描述了与我提到的相关的问题.

Boost.python允许创建要在同一进程中加载​​的python模块(动态库).使用boost.python创建的每个python模块,如果它们要在c ++级别一起通信,例如从另一个模块中的类A派生模块中的类B,则应该与boost.python lib动态链接以避免问题.