Отговори на тема  [ 9 мнения ] 
[разрешен] avr-g++ и pure virtual functions проблем 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 22, 2007 3:04 pm
Мнения: 48
Мнение [разрешен] avr-g++ и pure virtual functions проблем
Здравейте,

Имам бегли познания по C++, надявам се да се намери някой експерт тук и да разреши проблема. Описан е подробно тук:

http://www.arduino.cc/cgi-bin/yabb2/YaB ... 1240829167

На кратко -- опитвам се да компилирам библиотеката на Arduino с Eclipse. По някое време хората там са добавили pure virtual функции в един от класовете, и от тогава билда в Eclipse гърми, пък в тяхното IDE си минава като пич. Едно решение е някъде да си декларирам/дефинирам __cxa_pure_virtual(), обаче това не обяснява защо техния билд минава.

Лог на Eclipse билда:
http://pastebin.com/ma5cc4f6

Лог на билда с Arduino IDE:
http://pastebin.com/m173feebc

Тука е целия Eclipse проект:

http://1024.cjb.net/ABox.tar.gz

Mожете да пуснете билда със

make ABox.elf

в Debug директорията.

А, и ако някой знае къде/как да намеря описание на всички опции на avr-gcc ще съм благодарен. Няма man страница, единственото което намерих е avr-gcc -v --help, но и там няма някои от опциите които се използват.


Последна промяна lz3060 на Сря Май 20, 2009 4:16 pm, променена общо 1 път



Вто Апр 28, 2009 12:24 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Здравей,
информация за компилатора може да търсиш в документацията на GCC.
http://gcc.gnu.org/onlinedocs/
Не съм GNU гуру, но имам бегли спомени за същия проблем само че с arm-elf-gcc. Не си спомням вече какво беше решението при мен. Но ето няколко насоки. Опитай да линкваш с stdc++. Добавяш ключа "-lstdc++" след "-lm" при линкването.
За заобикаляне на проблема може да пробваш фиктивна дефиниция на __cxa_pure_virtual и по този начин - добавяш в линкер скрипта това:
Код:
PROVIDE (__cxa_pure_virtual = 0);

_________________
Най-опасният враг на истината и свободата е мнозинството.


Вто Апр 28, 2009 1:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
какво означава гърми? искаш да кажеш че еклипсето забива?


Вто Апр 28, 2009 2:15 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 22, 2007 3:04 pm
Мнения: 48
Мнение 
Код:
avr-gcc -Wl,-Map,ABox.map,--cref --gc-sections -mmcu=atmega328p -o"ABox.elf"  ./blink.o ./main.o  ./arduino/HardwareSerial.o ./arduino/Print.o ./arduino/WInterrupts.o ./arduino/WMath.o ./arduino/pins_arduino.o ./arduino/wiring.o ./arduino/wiring_analog.o ./arduino/wiring_digital.o ./arduino/wiring_pulse.o ./arduino/wiring_shift.o    -lm
./arduino/Print.o: In function `Print::println(double)':
../arduino/Print.cpp:153: undefined reference to `__cxa_pure_virtual'


Целия лог е тук:

http://pastebin.com/m7b87b78a

Има и разни обяснения/докатки/резултати в темата в Ардуино форума.

Проблема се решава ако сложа

Код:
extern "C" void __cxa_pure_virtual(void);
void __cxa_pure_virtual(void) {}


но се опитвам да разбера как/защо техния билд минава.


Вто Апр 28, 2009 2:28 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Е добре, нали не линкваш към core.a и т.н. както тях. undefined reference to __cxa_pure_virtual получаваш щото компилатора е създал връзка към този символ, но линкера няма къде да я върже тази връзка. При техния вариант го открива при твоя не. По принцип не вярвам да имаш проблеми със заобикалянето на проблема така както си го направил.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Вто Апр 28, 2009 3:51 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 22, 2007 3:04 pm
Мнения: 48
Мнение 
Бе и аз мисля, че няма да имам проблеми, но се терзая като не разбирам какво се случва :) Просто искам да знам. А и няма обяснение при тях от къде се появява, те компилират същата библиотека, и после я тъпчат в core.a.

Документацията на gcc я гледам, ама малко като теле. По конкретно, какво значи -lm като опция на линкера?

Пробвах да билд-на с еклипса с максимално близки опции на компилатора до техните (не мога да ги уеднаквя, щото средата си добавя някакви по подразбиране), обаче се предава със същата грешка ...


Вто Апр 28, 2009 4:30 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
-lm ще рече, че линкваш към math библиотеката. Ключа в случая е -l библиотеката m :)
Между впрочем линкера има отделна документация. Търси я при binutils.
Нали си със собствен make файл? Как така добавя опции по подразбиране? Между другото реда на задаване на ключовете също има значение понякога. Например при мен -lm трябва да е преди -lstdc++. От друга страна в линкер скрипта има директива с която точно това с реда на линкване мисля че може да се избегне. Виж темата на Цецо за туулчейна на Cortex-M3, последния пост.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Вто Апр 28, 2009 5:01 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 22, 2007 3:04 pm
Мнения: 48
Мнение 
Собствен Makefile, ама не съвсем. Еклипса ги генерира с automake (мисля). Има ги в архива

http://1024.cjb.net/ABox.tar.gz

Ще пробвам да съчиня мой си, ама не знам това колко време ще ми отнеме :( До сега един опит имам в тая насока, и той беше 2-3 таргета, не повече от 15тина реда ...


Вто Апр 28, 2009 5:25 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 22, 2007 3:04 pm
Мнения: 48
Мнение 
Здравейте пак,

След дълги седмици рисърч и ръчкане открих защо и как работи цялото нещо. Ключа е в магическите опции

-ffunction-sections -fdata-sections

за компилатора, и

-gc-sections

за линкера. Първите две казват на компилатора да сложи всяка функция и всяка променлива в отделна секция в обектния файл. Втората казва на линкера да garbage-collect (български термин?) секциите към които няма референции в кода, който ще се изпълнява. Така всичко ненужно се разкарва от изпълнимия файл. Заради тези опции няма проблем да се билд-не проект в който няма дефинирана __cxa_pure_virtual() -- тя не е нужна на линкера. И пак заради тях крайния резултат се получава значително по малък, особено ако имате много библиотеки в проекта, които не се използват. Ей тук има полезно инфо за avr-gcc и съвети за оптимизации:

http://www.tty1.net/blog/2008-04-29-avr ... ns_en.html

Дано съм бил полезен на някой :)


Сря Май 20, 2009 4:14 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 7 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни