带有继承的C ++共享库

时间:2012-01-23 19:03:18

标签: c++ inheritance linker shared

我有一个带有基类(MyClassA)的库(a.so)。另一个库(b.so)有一个MyClassB类,它继承自MyClassA(在a.so中)。我编译了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
  4. 当我尝试编译时,由于b.so而导致MyClassA出现一些引用错误。

    当我编译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
    4. 在C ++中是否可以使用我的第一个选项,或者是否需要始终在子类库中包含基本头文件?

3 个答案:

答案 0 :(得分:3)

如果您从ClassB派生ClassA,则应该在导出时ClassA 定义,而不仅仅是声明(< EM>引用)。这就是为什么你必须包含ClassA头文件。

但是如果您在ClassA文件中实现了cpp个功能,而不是在标头中,ClassA的实际代码将在a.so中,那么,包含ClassA头文件并不是真正的问题。

答案 1 :(得分:0)

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

在你的情况下:

  1. a.so包含MyClassA.h和MyClassA.cpp
  2. b.so包含MyClassB.h和MyClassB.cpp但MyClassB.h`#include“MyClassA.h”
  3. b.so使用以下链接a.so:
  4. g ++ -o b.so -la

答案 2 :(得分:0)

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