Название: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: vanessa от Апрель 16, 2010, 14:28 Есть у меня класс, типа шаблон, который наследуется несколькими другими классами. все методы этого класса виртуальные, конструктор и деструктор - пустышки. Наследники переопределяют виртуальные методы. Кроме того классы-наследники положены в библиотеку. Далее имею следующее, когда я собираю программу в месте с этой библиотекой линковщик говорит что не найдены конструктор и деструктор этого родительского класса.
Класс примерно такой Код: class IoDev Пример класса наследника Код: class NetIoDev: public QObject, public IoDev о-файл этого класса в библиотеке присутствует. а далее, когда я собираю программу и линкую ее с этой библиотекой (напомню, библиотека статическая) то вижу такую ошибку Код: g++ -o test2 build/main.o build/mainw.o build/moc_mainw.o -L../ -L/usr/lib -lrcada_client -lQtSql -lQtGui -lQtNetwork -lQtCore -lpthread Каr это исправить ? Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: kuzulis от Апрель 16, 2010, 15:08 попробуйте так:
iodev.h Код: class IoDev Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: vanessa от Апрель 16, 2010, 15:39 Не оно. Оно ведь не ругается на отсутствие виртуальных функций, оно ругается на отсутствие конструктора и деструктора класса-предка.
Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: crossly от Апрель 16, 2010, 18:12 и правильно ругается..... конструктор обязателен....
Код: class IoDev Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: vanessa от Апрель 16, 2010, 19:54 и правильно ругается..... конструктор обязателен.... ну так есть конструктор, я ж в первом посте написал.Код: class IoDev Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: vanessa от Апрель 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 то же что и выше но собирается не с библиотекой, а с фалами, из которых библиотека собирается. Программа тоже не собирается, ошибки те-же. В общем прошу помощи по запуску этого простенького проектика Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: break от Апрель 16, 2010, 22:57 Да дело действительно в тонкостях CPP
А именно вам требуется сделать определение чисто-виртуального деструктора в базовом классе - причем в cpp файле и тогда все заработает! подробнее здесь http://www.rsdn.ru/forum/cpp/2532634.1.aspx Во вложение рабочий проект с вашими классами - который и собирается и работает - но все в одном проекте для простоты Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: break от Апрель 16, 2010, 23:02 А вообще как то вот так надо все это с подпроектами оформлять (пример тоже компилируемый и рабочий с теми же классами)
Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: vanessa от Апрель 16, 2010, 23:17 Большое спасибо приведенная ссылка была для меня очень познавательна. Я тут тоже немного копался в своей программе и сделал следующее: удалил объявление деструтора из базового класса вообще. После этого программа начала собираться.
Название: Re: Ошибки линковки классов из статической библиотеки (Linux) Отправлено: break от Апрель 16, 2010, 23:25 Цитировать удалил объявление деструтора из базового класса вообще Но при этом и класс перестанет быть Абстрактным и его экземпляров можно будет создать! |