Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接:静态与动态_C++_Cross Platform_Dynamic Linking_Static Linking - Fatal编程技术网

C++ 链接:静态与动态

C++ 链接:静态与动态,c++,cross-platform,dynamic-linking,static-linking,C++,Cross Platform,Dynamic Linking,Static Linking,在我的应用程序中,我有3个主要部分: Exe:一个可执行文件 Lib_A:库包含一个singleton类和一个基类,用于在singleton中使用的某些计算 阶级 Lib_B:库包含许多从Lib_a中的基派生的类 我在Lib_B中有派生类的原因是,我想在运行时从Exe编译Lib_B。我需要在计算过程中生成派生类,而不终止整个系统。这对我来说太重要了。这意味着最初我可能会说Lib_B1是动态加载的,也可能会编译Lib_B的其他版本,如Lib_B2、Lib_B3、Lib_B4等,并动态加载它们。

在我的应用程序中,我有3个主要部分:

  • Exe:一个可执行文件
  • Lib_A:库包含一个singleton类和一个基类,用于在singleton中使用的某些计算 阶级
  • Lib_B:库包含许多从Lib_a中的基派生的类
我在Lib_B中有派生类的原因是,我想在运行时从Exe编译Lib_B。我需要在计算过程中生成派生类,而不终止整个系统。这对我来说太重要了。这意味着最初我可能会说Lib_B1是动态加载的,也可能会编译Lib_B的其他版本,如Lib_B2、Lib_B3、Lib_B4等,并动态加载它们。所有Lib_Bx库都有入口点函数来导出其中的类

因此,考虑到以下事实:

  • 在运行时,将有不同数量的文件共享同一库
  • 应用程序必须在Windows和Linux中运行。因此,部分跨平台是一个问题
  • 我将使用一些库,如TBB、Boost、Qt,它们可能有自己的库,如TBB.dll等
静态或动态链接Lib_A与Exe和Lib_Bx的优缺点是什么?如何影响系统的性能、大小等?除了每个操作系统,我需要对Exe、Lib_A和Lib_Bx使用相同的编译器之外,还有什么危险或困难的情况吗

整个系统的设计对我来说是一个非常困难的问题,所以任何意见都将不胜感激


非常感谢。

静态链接的最大优点是您不必提供大量DLL。除非您计划发布一个裸体可执行文件,否则我认为这不是问题

动态链接有一些很大的优势。您不必在每次进行更改时重新编译整个应用程序,只需修改DLL即可。您可以将更新的dll与应用程序的其余部分分开分发,只要它们与ABI兼容

在Windows和Linux上使用相同的编译器可能更简单,但您肯定不必使用相同的编译器


只要您坚持使用可移植库,Windows和Linux之间的最大区别通常是构建系统。一些开发人员维护完全独立的构建系统,但是有很多跨平台的构建系统,比如cmake。

您想创建新的运行时类吗?C++不是这样工作的。C++类是静态的,应该都存在编译时间。共享的、可动态加载的库并不是为了解决这个问题

最简单的解决方案可能是嵌入具有动态类型的语言的解释器(例如Lua),并在其中写入运行时动态对象


如果您真的想以独立于平台的方式与运行时编译的模块交互,那么最好使用一些语言中立和平台中立的接口,比如CORBA。然后,在Linux和Windows上编译和运行的东西都可以相互交互,并编译新成员加入帮派

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

比如说,如果你在Lib_a中有一个类,它的形式是:

class BaseKlass
{
  static int instance_count;
  ...
};
instance\u count
将在所有共享库中重复,从而使
BaseKlass
无法对其实例进行计数

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

你应该看看这个,它描述了与我提到的相关的问题


python允许创建在同一进程中加载的python模块(动态库)。每个Python模块都是用BooSt.python创建的,如果它们是在C++级别上进行通信的,比如从另一个模块中的类A中派生出一个模块中的类B,应该与boost.python lib动态链接以避免出现问题。

原则上,如果这三个都是DLL,这一切都是可能的-您可以从应用程序触发编译器,然后动态加载新的DLL。这与任何其他插件体系结构都一样(将Lib_Bx DLL视为插件)


不过,我怀疑这是否一种明智的做法。对于解决方案,你需要完全的C++编译器的灵活性吗?你描述过解决这个问题的不同方法吗?如果你正在进行数值处理,像OpenCL之类的东西是更好的方法?

但是我可能不利于C++的速度和灵活性。任何应用程序的速度主要来自高技能的开发人员。从用户输入运行时生成的代码不应该是高效的,但在不需要效率的情况下(如原型设计)可能是有用的。因此,我建议使用一些脚本解释器。是的,从用户输入运行时生成的代码不应该是有效的,但是从用户输入运行时编译的二进制代码应该比从脚本解释器编译的代码快得多。是的,一旦编译完成。调用编译器也不是免费的。就像我说的C++假设静态类型,所以不能创建新的C++类运行时。也许你应该尝试使用一些语言中立的接口,比如CORBA,来与这些运行时生成的模块进行交互?我认为Lua与C++相比是相当快的。如果您正在做一些过度CPU密集和复杂的事情,那么Lua可能会减慢速度,但对于大多数事情,包括寻路算法,它仍然相当快。Python是AngelCode的另一个选择(Wolfire团队在他们的新游戏中广泛使用),我希望在Windows中使用MSVC++编译器和Linux中的英特尔C++编译器。我认为两者都能产生更好的优化cod