C++通过继承共享库

C++ shared libraries with inheritance

本文关键字:共享 继承 C++      更新时间:2023-10-16

我有一个带有基类(MyClassA)的库(a.so)。另一个库(b.so)有一个从MyClassA(在a.so中)继承的类MyClassB。我编译在a.so隔离的MyClassA.h和MyClassA.cpp。MyClassB.h和MyClassB.cpp是在隔离状态下编译的(引用了MyClassA.h,但没有将MyClassA.h添加到b.so)。然后我将b.so链接到a.so。

总结:

  1. a.so包含MyClassA.h和MyClassA.cpp
  2. b.so包含MyClassB.h和MyClassB.cpp
  3. b.so与a.so相连

当我尝试编译时,我得到了许多MyClassA的引用错误,这些错误是由b.so.引起的

当我编译b.so并将MyClass.h添加到其中时,该库编译并运行时没有任何错误。因此:

  1. a.so包含MyClassA.h和MyClassA.cpp
  2. b.so包含MyClassB.h、MyClassB.cpp和MyClassA.h
  3. b.so与a.so相连

在C++中是否可以使用我的第一个选项,或者是否需要在子类库中始终包含基头?

如果从ClassA派生ClassB,则在派生时应定义ClassA,而不仅仅声明(引用)。这就是为什么必须包含ClassA头文件的原因。

但如果在cpp文件中实现ClassA函数,而不是在头文件中,则ClassA的实际代码将在a.so中,因此,包含ClassA头文件并不是一个真正的问题。

所有派生类在编译时都必须有#include基类声明。基类实现必须在链接时已知。

在您的情况下:

  1. a.so包含MyClassA.h和MyClassA.cpp
  2. b.so包含MyClassB.h和MyClassB.cpp,但MyClassB.h`#包含"MyClassA.h"
  3. b.so链接a.so使用:

g++-o b.so-la

如果class B是从class A派生的,则必须包括class A头文件。