C++ C++;具有继承的共享库

C++ C++;具有继承的共享库,c++,inheritance,linker,shared,C++,Inheritance,Linker,Shared,我有一个带有基类(MyClassA)的库(a.so)。另一个库(b.so)有一个从MyClassA继承的类MyClassB(在a.so中)。我编译在a.so中隔离的MyClassA.h和MyClassA.cpp。MyClassB.h和MyClassB.cpp是独立编译的(引用MyClassA.h,但没有将MyClassA.h添加到b.so)。然后我把b.so链接到a.so 总结如下: a、 所以包含MyClassA.h和MyClassA.cpp b、 因此包含MyClassB.h和MyClass

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

总结如下:

  • a、 所以包含MyClassA.h和MyClassA.cpp
  • b、 因此包含MyClassB.h和MyClassB.cpp
  • b、 so链接到a.so
  • 当我试图编译时,我得到了许多MyClassA的引用错误,这是由b.so引起的

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

  • a、 所以包含MyClassA.h和MyClassA.cpp
  • b、 因此包含MyClassB.h、MyClassB.cpp和MyClassA.h
  • b、 so链接到a.so

  • C++中是否可以使用我的第一个选项,或者它是否需要总是在子类库中包含基头?< /p> < P>所有派生类必须在编译时包含< >代码>基类声明。基类实现必须在链接时已知

    就你而言:

  • a、 所以包含MyClassA.h和MyClassA.cpp
  • b、 所以包含MyClassB.h和MyClassB.cpp,但MyClassB.h`#包含“MyClassA.h”
  • b、 so链接a.so使用:

  • g++-o b.so-la

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


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

    如果
    classb
    是从
    ClassA
    派生出来的,然后必须包括
    A类
    头文件

    作为第一个选项,我们需要看到更多的错误和代码,尤其是标题,以及它们所包含的内容。#include“MyClassA.h”在标题MyClassB中。这不是问题所在。问题是我实际上必须将我的classa.h包含在b.so中。这大大增加了库的大小。我以为链接器(编译器)在构建时会查看头文件,但我不必实际将MyClassA.h添加到b.so。当我这样做的时候,我会得到引用错误。真的,你不需要在b.so中包含MyClassA.h。向我们展示MyclassA.h和MyClassB.h以及编译和链接命令。我不包括它,编译器包括它。我检查过:如果我向MyClassA的头添加一些字符串并编译MyClassB(b.so),那么b.so的大小会增加。因此编译器会自动将MyClassA.h拉到b.So。我目前正在使用CMake,正在忙着创建一个简单的示例,使用普通的g++编译上传一个测试示例。如果在MyClassA.h中取消注释第13行,liba.so和libb.so的大小都会增加。我对增加liba.so的大小很满意,但我希望libb.so的大小保持不变,不管MyClassA.h中有什么变化。唯一的问题是a中有很多头,所以我在b中使用。当我向b.so添加标题时,b.so的大小会急剧增加(即使只包含标题而不包含cpp文件)。我想知道是否有办法解决这个问题,这样我就可以把b保持得很小。毕竟,头已经在a.s检查如果你的头包含代码,比如函数防御(不是声明),或者可能是一些模板用法,你可以尝试使用
    pimpl
    facade
    模式来减少公共头的大小。我的基类头中有很多纯虚拟函数减速,没有实施。这就是头球如此之大的原因。如果我有50个子库继承自a.so中的类,那么a.so中的类的头数据(比如100kb)在50个子库中的每一个子库中都是重复的。这是50x100kb=几乎5mb的复制头,实际上已经存在于a中。所以,你不能这样计算。100kb中的大部分可能是运行时依赖项,如果你写“hello world”,你可以得到50kb,但这意味着什么都没有。约翰,你知道的。只是想知道是否有一个技巧告诉b.so不要直接包含头,而是在运行时自动从a.so中提取头?