C ++ разделяемые библиотеки с наследованием - PullRequest
1 голос
/ 23 января 2012

У меня есть библиотека (a.so) с базовыми классами (MyClassA). Другая библиотека (b.so) имеет класс MyClassB, который наследуется от MyClassA (в a.so). Я компилирую MyClassA.h и MyClassA.cpp, изолированные в a.so. 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 ++ использовать мой первый вариант или требуется всегда включать базовые заголовки в библиотеку подклассов?

Ответы [ 3 ]

3 голосов
/ 23 января 2012

Если вы извлекаете ClassB из ClassA, вы должны иметь ClassA , определенное , при получении не только , объявленное ( ссылка ).Вот почему вы должны включить заголовочный файл ClassA.

Но если вы реализовали ClassA функции в файле cpp, а не в заголовке, фактический код из ClassA будетбыть в a.so, поэтому включение заголовочного файла ClassA на самом деле не проблема.

0 голосов
/ 22 июня 2012

Если class B является производным от class A, тогда должен быть включен заголовочный файл class A.

0 голосов
/ 23 января 2012

Все производные классы должны #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, используя:

g ++ -o b.so -л

...