Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 10.05.2021
Сообщений: 4

Наследование от класса с виртуальными функциями в сторонней динамической библиотеке

10.05.2021, 05:03. Показов 1014. Ответов 5

Студворк — интернет-сервис помощи студентам
Есть класс с виртуальными функциями, например, Parent вида:

файл Parent.h:
C++
1
2
3
4
5
6
class Parent
{
public:
  Parent() {}
  virtual ~Parent();
};
файл Parent.cpp:
C++
1
2
3
4
#include "Parent.h"
Parent::~Parent()
{
}
из них строится динамическая библиотека libParent.so

могу ли я в другом своём проекте как-то создать и использовать наследника, например, класс Child вида:

файл Child.h:
C++
1
2
3
4
5
6
7
#include "Parent.h"
class Child : public Parent
{
public:
  Child() {}
  virtual ~Child();
};
файл Child.cpp:
C++
1
2
3
4
5
#include "Child.h"
Child::~Child()
{
}
Child tmp;
и собирается проект Child с помощью CMake, фрагмент CMakeLists.txt:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)
В результате при построении я получаю ошибку вида:

Code
1
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?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2021, 05:03
Ответы с готовыми решениями:

Подключение к проекту на Qt5.7 сторонней динамической библиотеке
Здравствуйте. Возник следующий вопрос с подключением сторонней динамической библиотеке в свой проекте написанном на Qt. Программка...

Создание класса в динамической библиотеке
Доброго времени суток! Прочел статью в на cyberguru: как написать динамическую библиотеку, и решил попробовать. Но в тестирующей...

Работа с виртуальными функциями
Доброго времени суток, форумчани! Помогите мне, пожалуйста, с задачей, у меня просто нет этой темы, а сдать нужно обязательно :( ...

5
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
10.05.2021, 07:25
Цитата Сообщение от Elija Посмотреть сообщение
Как я понимаю, это происходит потому, что виртуальные функции класса Parent определены в файле Parent.cpp и соответственно находятся только внутри библиотеки libParent.so, а в Parent.h есть только их объявление и в результате при построении проекта Child компилятор не находит необходимые ему определения виртуальных функций родительского класса и выдаёт ошибку.
Нет, не потому.

Пример который вы привели - он точен? Именно на таком элементарном коде вы получаете такую ошибку?
0
0 / 0 / 0
Регистрация: 10.05.2021
Сообщений: 4
10.05.2021, 07:41  [ТС]
TheCalligrapher,
Пример который вы привели - он точен? Именно на таком элементарном коде вы получаете такую ошибку?
Классы на которых изначально возникла проблема сложнее. Но в процессе выяснения причин ошибки, я добавил эти элементарные классы и на них не работает, как я описал. Ну или работает, если перенести определение виртуальных функций из .cpp в .h.
P.S. Я использую Android Studio 4.1.3 + clang++
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
10.05.2021, 18:01
Цитата Сообщение от Elija Посмотреть сообщение
P.S. Я использую Android Studio 4.1.3 + clang++
Надо смотреть установки компиляции библиотеки. Включена ли там вообще генерация RTTI, то есть нет ли там какого -fno-rtti в настройках.

Цитата Сообщение от Elija Посмотреть сообщение
я добавил эти элементарные классы
"Добавил" именно в виде новых файлов Parent.h/Parent.cpp или все таки в уже существующие файлы? Если Parent.cpp - отдельный файл, то он вообще участвует в построении библиотеки?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.05.2021, 18:34
Elija, по идее, если это не шаблоны то всё должно слинковаться. Я только не увидел прототипов виртуальных функций (кроме деструктора) в заголовочнике Parent.h. Если их там нет, то и не будет ни чего. Дополните пример. Реализации функций можете оставить в cpp-шниках.
Верно и то, что если определены прототипы (не чисто виртуальных методов) без определения (даже в других файлах типа cpp) то тоже плохо.
0
0 / 0 / 0
Регистрация: 10.05.2021
Сообщений: 4
12.05.2021, 06:25  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Надо смотреть установки компиляции библиотеки. Включена ли там вообще генерация RTTI, то есть нет ли там какого -fno-rtti в настройках.
-fno-rtti отсутствует

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Добавил" именно в виде новых файлов Parent.h/Parent.cpp или все таки в уже существующие файлы? Если Parent.cpp - отдельный файл, то он вообще участвует в построении библиотеки?
Добавил в существующий в проекте файл, чтобы эксперимент был проще. Когда я увидел undefined reference, то первым делом проверил подключение файла к проекту. Он там есть. И функции других классов этого файла находятся внутри библиотеки libParent.so

Добавлено через 9 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
по идее, если это не шаблоны то всё должно слинковаться. Я только не увидел прототипов виртуальных функций (кроме деструктора) в заголовочнике Parent.h. Если их там нет, то и не будет ни чего. Дополните пример. Реализации функций можете оставить в cpp-шниках.
Верно и то, что если определены прототипы (не чисто виртуальных методов) без определения (даже в других файлах типа cpp) то тоже плохо.
Это не шаблоны. Я добавлял и другие виртуальные функции, но для упрощения примера оставил только деструктор. Наличия виртуального деструктора хватает для того поведения, что я описал. Я понимаю, что если есть объявление, но нет определения функции, то и возникает undefined reference. Но это не тот случай. Вернее не тот случай в том смысле, что определения всех функций есть в cpp. Но по какой-то причине линкер их не видит?

Попробую сделать минимальный пример с участием только описанных файлов Parent и Child. Если получится и поведение останется прежним, то выложу тут ссылку на github.

Добавлено через 1 минуту
Добавлено через 2 часа 33 минуты
Цитата Сообщение от Elija Посмотреть сообщение
Попробую сделать минимальный пример с участием только описанных файлов Parent и Child. Если получится и поведение останется прежним, то выложу тут ссылку на github.
Собрал такой элементарный проект и выяснил, что данная ситуация происходит, только когда библиотека libParent.so собирается с помощью ndk-build. Если же у неё поменять сборку на cmake, то всё собирается без проблем. Проект Child всегда собирается через cmake. Буду разбираться уже с системой сборки. Всем спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2021, 06:25
Помогаю со студенческими работами здесь

Проблема с виртуальными функциями
Привет. Столкнулся с небольшой проблемой, касательно виртуальных функций. Стыдно спрашивать, ибо это нечто элементарное. Просто я уже...

Задачка с наследованием и виртуальными функциями
Диаграмма классов на приложенном рисунке. #include <iostream> class IData { public: virtual ~IData() = 0 {} virtual...

Классы с виртуальными функциями. Class Student
Создать класс Студент со свойствами: ФИО, Факультет, Курс, минималь- ная оценка по экзаменам за последнюю сессию (по 5-ти бальной...

Неправильный вывод при работе с виртуальными функциями
В общем, учу плюсы по книге Праты. Там есть одно задание по виртуальным функциям. Но дело сейчас не в них. У меня есть базовый (Cd) и...

Изменения в сторонней библиотеке
Приветствую! Что требуется, чтобы иметь возможность внести изменения в стороннюю библиотеку (локально)? Если это важно, ОС - windows. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru