Russian Qt Forum
Сентябрь 30, 2024, 14:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибки линковки классов из статической библиотеки (Linux)  (Прочитано 6467 раз)
vanessa
Гость
« : Апрель 16, 2010, 14:28 »

Есть у меня класс, типа шаблон, который наследуется несколькими другими классами. все методы этого класса виртуальные, конструктор и деструктор - пустышки. Наследники переопределяют виртуальные методы. Кроме того классы-наследники положены в библиотеку. Далее имею следующее, когда я собираю программу в месте с этой библиотекой линковщик говорит что не найдены конструктор и деструктор этого родительского класса.

Класс примерно такой
Код:
class IoDev
{
public:
IoDev() {}
virtual ~IoDev() {}
virtual void sendValue(int i) {}
virtual int getValue() {}
};
Есть только заголовок, срр-файла нет для этого класса хотя если его даже сделать и в нем написать реализации методов - ничего не меняется.
Пример класса наследника
Код:
class NetIoDev: public QObject, public IoDev
{
Q_OBJECT
public:
NetIoDev();
~NetIoDev();

viod sendValue(int i);
int getValue();
// и так далее
};

о-файл этого класса в библиотеке присутствует.
а далее, когда я собираю программу и линкую ее с этой библиотекой (напомню, библиотека статическая) то вижу такую ошибку
Код:
g++ -o test2 build/main.o build/mainw.o build/moc_mainw.o -L../ -L/usr/lib -lrcada_client -lQtSql -lQtGui -lQtNetwork -lQtCore -lpthread
..//librcada_client.a(netiodev.o): In function `NetIoDev':
/home/vanessa/src/QT4/src/lib/ionetclient/netiodev.cpp:7: undefined reference to `IoDev::IoDev()'
/home/vanessa/src/QT4/src/lib/ionetclient/netiodev.cpp:7: undefined reference to `IoDev::IoDev()'
..//librcada_client.a(netiodev.o): In function `~NetIoDev':
/home/vanessa/src/QT4/src/lib/ionetclient/netiodev.cpp:16: undefined reference to `IoDev::~IoDev()'
/home/vanessa/src/QT4/src/lib/ionetclient/netiodev.cpp:16: undefined reference to `IoDev::~IoDev()'
/home/vanessa/src/QT4/src/lib/ionetclient/netiodev.cpp:16: undefined reference to `IoDev::~IoDev()'
..//librcada_client.a(netiodev.o):(.data.rel.ro._ZTI8NetIoDev[typeinfo for NetIoDev]+0x18): undefined reference to `typeinfo for IoDev'
В строке 7 файла netiodev.cpp начинается конструктор класса NetIoDev в строке 16 - деструктор



Каr это исправить ?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Апрель 16, 2010, 15:08 »

попробуйте так:
iodev.h
Код:
class IoDev
{
public:
IoDev();
virtual ~IoDev();
virtual void sendValue(int i) = 0;
virtual int getValue() = 0;
};
« Последнее редактирование: Апрель 16, 2010, 15:12 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
vanessa
Гость
« Ответ #2 : Апрель 16, 2010, 15:39 »

Не оно. Оно ведь не ругается на отсутствие виртуальных функций, оно ругается на отсутствие конструктора и деструктора класса-предка.
Записан
crossly
Гость
« Ответ #3 : Апрель 16, 2010, 18:12 »

и правильно ругается..... конструктор обязателен....
Код:
class IoDev
{
public:
IoDev(){};
virtual ~IoDev(){};
virtual void sendValue(int i) = 0;
virtual int getValue() = 0;
};
Записан
vanessa
Гость
« Ответ #4 : Апрель 16, 2010, 19:54 »

и правильно ругается..... конструктор обязателен....
Код:
class IoDev
{
public:
IoDev(){};
virtual ~IoDev(){};
virtual void sendValue(int i) = 0;
virtual int getValue() = 0;
};
ну так есть конструктор, я ж в первом посте написал.
Записан
vanessa
Гость
« Ответ #5 : Апрель 16, 2010, 21:19 »

похоже проблема совсем не в библиотеке, а скорее в моем не очень хорошем знании С++. я сделал небольшой тестовый проектик и оно не собирается ни с библиотекой ни без. он во вложении. там три .pro-файла
1) test/libtest.pro - собирает из netiodev.cpp netiodev.h и iodev.h библиотеку libtest.a
2) test/1/test.pro - собирает из main.cpp и указанной выше библиотеки простенькую программку, но оно не собирается
3) test/2/test.pro то же что и выше но собирается не с библиотекой, а с фалами, из которых библиотека собирается. Программа тоже не собирается, ошибки те-же.

В общем прошу помощи по запуску этого простенького проектика


Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Апрель 16, 2010, 22:57 »

Да дело действительно в тонкостях CPP

А именно вам требуется сделать определение чисто-виртуального деструктора в базовом классе - причем в cpp файле и тогда все заработает!

подробнее здесь http://www.rsdn.ru/forum/cpp/2532634.1.aspx

Во вложение рабочий проект с вашими классами - который и собирается и работает - но все в одном проекте для простоты
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #7 : Апрель 16, 2010, 23:02 »

А вообще как то вот так надо все это с подпроектами оформлять (пример тоже компилируемый и рабочий с теми же классами)
Записан
vanessa
Гость
« Ответ #8 : Апрель 16, 2010, 23:17 »

Большое спасибо приведенная ссылка была для меня очень познавательна. Я тут тоже немного копался в своей программе и сделал следующее: удалил объявление деструтора из базового класса вообще. После этого программа начала собираться.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #9 : Апрель 16, 2010, 23:25 »

Цитировать
удалил объявление деструтора из базового класса вообще

Но при этом и класс перестанет быть Абстрактным и его экземпляров можно будет создать!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.