LINUX.ORG.RU

[Qt] Серьёзная проблема с линковкой

 


0

0

Есть простое тестовое приложение и главное. К обоим линкуются три статик библиотеки, с такими зависимостями:
graphics < objects < drawings
В библиотеке «drawings» есть класс, в котором несколько методов оперируют объектами классов из «objects».
Тестовое приложение собирается, линкуется и запускается нормально. Главное падает на линковке:

../drawings/release/libdrawings.a(drawpanel.o):drawpanel.cpp:(.text+0x24a): undefined reference to `BaseElement::VectorImage()'
../drawings/release/libdrawings.a(drawpanel.o):drawpanel.cpp:(.text+0x36b): undefined reference to `ElementImage::PaintToBuffer(double)'
../drawings/release/libdrawings.a(drawpanel.o):drawpanel.cpp:(.text+0x373): undefined reference to `ElementImage::GetBufferImage()'
../drawings/release/libdrawings.a(drawpanel.o):drawpanel.cpp:(.text+0x3c1): undefined reference to `ElementImage::ElementImage()'
../drawings/release/libdrawings.a(drawpanel.o):drawpanel.cpp:(.text+0x3d9): undefined reference to `ElementImage::Create(int, int)'

Класс наследуется от QObject, все макросы на месте. Полная пересборка не помогает.
Линковщик не может найти методы класса, вообще никакие. Что делать ?


В какой библиотеке находятся эти символы? Вижу, что статическую либу линкуешь, скорее всего порядок линковки у тебя неправильный.

Reset ★★★★★
()
Ответ на: комментарий от Reset

В drawings. Порядок линковки я не вижу. В *.pro указано:

LIBS += ../fluffy/$$DESTDIR/libgraphics.a
LIBS += ../baselib/$$DESTDIR/libobjects.a
LIBS += ../drawings/$$DESTDIR/libdrawings.a

INCLUDEPATH += ../baselib
INCLUDEPATH += ../drawings
INCLUDEPATH += ../graphics

Последняя строчка вывода, перед ошибками:
../fluffy/release/libgraphics.a ../baselib/release/libobjects.a ../drawings/release/libdrawings.a -lQtXml4 -lQtGui4 -lQtCore4

jreznot
() автор топика
Ответ на: комментарий от dimon555

>пробуй так сделать, явно гуй использует коре.

Вот как раз поэтому коре и должен быть последним.

Led ★★★☆☆
()
Ответ на: комментарий от jreznot

> LIBS += ../fluffy/$$DESTDIR/libgraphics.a

LIBS += -L../fluffy/$$DESTDIR/ -lgraphics

?

unC0Rr ★★★★★
()

А не забыл ли ты добавить ElementImage.cpp (образно говоря) в список исходников библиотеки?

JackYF ★★★★
()
Ответ на: комментарий от JackYF

Нет, не забыл. Объясняю ещё раз: тестовое приложение собирается с этими же либами.
Если не будете сильно кидаться камнями: http://code.google.com/p/microdesigner/source/checkout
Проект лежит в trunk. Буду благодарен, если кто-то скажет в чём дело. Не собирается подпроект microdesigner - исполняемый модуль, но собирается тестовый logictest.

jreznot
() автор топика
Ответ на: комментарий от JackYF

Проблема стала немного чётче: в главном приложении мы достаём объект из подключенной либы. Далее хотим взять его поле класса, определённого в другой либе. Вот для последнего класса линкер не может найти реализацию.

jreznot
() автор топика
Ответ на: комментарий от jreznot

Ну чтож, как оказалось виновата кривая оптимизация -O2, неверно проверялось использование функций в объектах. И эти функции выбрасывались.
Если в исполняемом проекте оставить мусорную функцию с использованием нужных объектов и нигде не использовать её, то всё пашет.
:( Косяки компилятора на лицо

jreznot
() автор топика
Ответ на: комментарий от jreznot

Ну чтож, как оказалось виновата кривая оптимизация -O2, неверно проверялось использование функций в объектах. И эти функции выбрасывались. Если в исполняемом проекте оставить мусорную функцию с использованием нужных объектов и нигде не использовать её, то всё пашет. :( Косяки компилятора на лицо

Не верю! (С) Станиславский

anonymous
()
Ответ на: комментарий от anonymous

Если уберу из проекта temp_function(), то он больше не соберётся. Ибо компилер нафиг вычищает всё, что напрямую не используется.

jreznot
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.