Есть класс с виртуальными функциями, например, Parent вида:
файл Parent.h:
class Parent
{
public:
Parent() {}
virtual ~Parent();
};
файл Parent.cpp:
#include "Parent.h"
Parent::~Parent()
{
}
из них строится динамическая библиотека libParent.so
могу ли я в другом своём проекте как-то создать и использовать наследника, например, класс Child вида:
файл Child.h:
#include "Parent.h"
class Child : public Parent
{
public:
Child() {}
virtual ~Child();
};
файл Child.cpp:
#include "Child.h"
Child::~Child()
{
}
Child tmp;
и собирается проект Child с помощью CMake, фрагмент CMakeLists.txt:
add_library( # Sets the name of the library.
parent
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
IMPORTED)
set_target_properties(parent PROPERTIES IMPORTED_LOCATION
$ENV{PARENT_PATH}/libParent.so)
add_library( # Sets the name of the library.
child
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
$ENV{CHILD_PATH}/Child.cpp)
target_link_libraries( # Specifies the target library.
child
parent)
В результате при построении я получаю ошибку вида:
Child.cpp.o:Child.cpp:typeinfo for Child: error: undefined reference to 'typeinfo for Parent'
Как я понимаю, это происходит потому, что виртуальные функции класса Parent определены в файле Parent.cpp и соответственно находятся только внутри библиотеки libParent.so, а в Parent.h есть только их объявление и в результате при построении проекта Child компилятор не находит необходимые ему определения виртуальных функций родительского класса и выдаёт ошибку.
Если я перенесу определение виртуальных функций из Parent.cpp в Parent.h, то ошибка исчезает. Как я понимаю, поскольку теперь в Parent.h содержится полная информация о классе Parent и этого достаточно для построения дочернего класса Child.
Но что мне можно сделать, если я не хочу менять эту стороннюю библиотеку libParent.so и переносить определения виртуальных функций из cpp в h, а просто хочу воспользоваться её классом Parent с виртуальными функциями в качестве предка для моего класса Child? Возможно ли это в принципе? Может мне нужно каким-то особым образом подключить к проекту Child библиотеку libParent.so, чтобы при построении проекта Child компилятор мог увидеть/использовать определения виртуальных функций внутри библиотеки libParent.so?