Требуется помощь при компиляции программы из исходников

Аватар пользователя ZaySan

Программу (visual типа scada)хозяин пытался перевести из Java в C++, для запуска через VGAlib. В джаве основу всех классов
составляет класс Class, Это тытались реализовать в С++, в этом наверное и проблемы.
Пакет забыли, видимо, он обновлялся аж в 2004 году. Я пытался его править, чтобы запустить, там интересные вещи
для меня. Исправил сколько смог. На этапе уже линковки выдает:

...
g++ hmiDigital.o hmiFixText.o hmiLimited.o hmiHBar.o hmi.o list.o kiwiList.o\
Applet.o Socket.o kiprList.o kList.o Class.o imggif.o image.o vgaGraph.o \
hmiIcon.o System.o Integer.o hmiVBar.o hmiPoti.o hmiAnalog.o hmiRollSwitch.o \
hmiLightUp.o ttimage.o -lgcc -lvga -lungif -lpthread -lttf -o hmi
..
Class.o(.gnu.linkonce.t._ZN8kiprListC1Ev[kiprList::kiprList()]+0x16):
In function `kiprList::kiprList()':
Class.cc: undefined reference to `vtable for kiprList'
collect2: ld returned 1 exit status
make: *** [hmi] Ошибка 1

Т.е. связать не может, А препроц и компиль проходит, а линковка нет.
Может опции? Помогите, откройте глаза мне! Подтолкните в Нужную сторону.
Если надо, то исходники выложу (около 70к).

Аватар пользователя ks

Re: Требуется помощь при компиляции программы из исходников

Цитата:
undefined reference to `vtable for kiprList

Похоже, что объявлена, но не реализована какая-то виртуальная функция для класса kiprList.

Покажите класс kiprList и его предков, если есть.

Аватар пользователя ZaySan

Требуется помощь при компиляции программы из исходников

Уважаемый , ks. В файле "kiprList.h" действительно было описание ф-ции compare.. а в "kiprList.сс" его нереализовали, но эта функ-я есть в родительских
классах. Я убрал из "kiprList.h" её, в результате отчёт не содержит даже упоминания о kiprList. Т.е. просто:

collect2: ld returned 1 exit status
make: *** [hmi] Ошибка 1

Продвижение уже есть, но Вопросы:
1. `vtable for kiprList' - это именно косяк с виртуальной функцией?
2. Как узнать где копать , его ему ненравится?

Аватар пользователя ks

Re: Требуется помощь при компиляции программы из исходников

Цитата:
Если надо, то исходники выложу (около 70к)

Уважаемый ZaySan, давайте сырцы.

Аватар пользователя Hidrag

Re: Требуется помощь при компиляции программы из исходников

Интересно а чем вызвана необходимость перевода на Java?

Аватар пользователя ZaySan

Требуется помощь при компиляции программы из исходников

Для Hidrag: Уважаемый, не на Java , а с неё. Есть подозрения, что успешно.

А для тех, кто хочет наставить на путь истинный:
Ссылка - http://zaycevsn.narod.ru/hmi_1.rar
Нужно доставить svgalib (1.9.25), слегка настроить.
Возможно придётся подправить Makefile у Hmi.

Аватар пользователя ks

Re: Требуется помощь при компиляции программы из исходников

Уважаемый ZaySan!

Исправления выложил сюда: http://file4.webfile.ru/1997933/hmi_2.tar.gz

Замечания:

1. В классах с виртуальными функциями или в классах, которые являются предками классов с вирт. функциями, отсутствовал виртуальный деструктор. Возможно в его добавлении не было никакого смысла, но я его добавил, чтобы потом не нарваться на неприятности с приведением типов. Т.е., есть негласное правило - в бызовых классах классов с виртуальными функциями определять виртуальные деструкторы.

2. В hmi.h была явная ошибка (по всей видимости не линковалось из-за нее):
Объявление:
String strinhh;
при чем hmi.h включается в тело других объектных модулей, из-за чего происходил конфликт имен для strinhh при линковке.
`String strinhh' я прописал в hmi.cc, а в hmi.h, соответственно, объявил `extern String strinhh'

3. В hmi.cc не было `include "hmi.h" '. Это не ошибка, но рекомендую прописывать заголовочные файлы в теле файла основного модуля, чтобы проверять изменения объявлений и реализаций.

4. Что не понравилось. В разных местах встречается и и т.д. Вы уж используйте что-то одно - либо устаревшие классы, либо стандартные, а то можно нарваться на какой-нить конфликт времени выполнения.

ЗЫ

В логику не вникал и не тестировал, просто прошелся глазом.
Обратите внимание на предупреждения.

ЗЗЫ

Удачи!

Аватар пользователя ks

Re: Требуется помощь при компиляции программы из исходников

Цитата:
`vtable for kiprList' - это именно косяк с виртуальной функцией?

Догадка. Вы объявили виртуальную функцию, но не реализовали ее. Компилятор где-то увидел вызов виртуальной функции и прописал в объектнике взятие адреса функции из таблицы виртуальных функций для объекта. Ес-но из-за отсутствия самой функции, виртуальная таблица не была создана. Вот тут, имхо, компилятор странно себя повел, ибо должен был ругаться еще в том месте, где происходит инициализация таблицы.

Возможно это и есть сообщение об ошибке во время инициализации таблицы в во время создания объекта:

Class.o(.gnu.linkonce.t._ZN8kiprListC1Ev[kiprList::kiprList()]+0x16):
In function `kiprList::kiprList()':

но какое-то оно бестолковое. Т.е., чтобы точно выяснить что к чему, нужно ковыряться в потрохах g++.

Аватар пользователя ZaySan

Требуется помощь при компиляции программы из исходников

Дорогой друг,ks, писал:

Цитата:
Исправления выложил сюда: http://file4.webfile.ru/1997933/hmi_2.tar.gz

А там пишут, что срок хранения истёк и файл удалили.
Если не в тягость, сбросьте на - zaycevsn@narod.ru
Буду доламывать прогу дальше. За помощь БОЛЬШОЕ спасиба, я сам бы доолго мучался.

Аватар пользователя ZaySan

Re: Требуется помощь при ...

Завел, таки, я этот пакет. Слегка подправил исходники, подчистил. Научился рисовать
курсоры в gif-формате. и т.д.
Если каво-нибудь интересует, то можно поговорить.

RSS-материал