Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

[разрешен] avr-g++ и pure virtual functions проблем
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6765
Страница 1 от 1

Автор:  lz3060 [ Вто Апр 28, 2009 12:24 pm ]
Заглавие:  [разрешен] 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, но и там няма някои от опциите които се използват.

Автор:  Zdrav [ Вто Апр 28, 2009 1:16 pm ]
Заглавие: 

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

Автор:  zaphod [ Вто Апр 28, 2009 2:15 pm ]
Заглавие: 

какво означава гърми? искаш да кажеш че еклипсето забива?

Автор:  lz3060 [ Вто Апр 28, 2009 2:28 pm ]
Заглавие: 

Код:
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) {}


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

Автор:  Zdrav [ Вто Апр 28, 2009 3:51 pm ]
Заглавие: 

Е добре, нали не линкваш към core.a и т.н. както тях. undefined reference to __cxa_pure_virtual получаваш щото компилатора е създал връзка към този символ, но линкера няма къде да я върже тази връзка. При техния вариант го открива при твоя не. По принцип не вярвам да имаш проблеми със заобикалянето на проблема така както си го направил.

Автор:  lz3060 [ Вто Апр 28, 2009 4:30 pm ]
Заглавие: 

Бе и аз мисля, че няма да имам проблеми, но се терзая като не разбирам какво се случва :) Просто искам да знам. А и няма обяснение при тях от къде се появява, те компилират същата библиотека, и после я тъпчат в core.a.

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

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

Автор:  Zdrav [ Вто Апр 28, 2009 5:01 pm ]
Заглавие: 

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

Автор:  lz3060 [ Вто Апр 28, 2009 5:25 pm ]
Заглавие: 

Собствен Makefile, ама не съвсем. Еклипса ги генерира с automake (мисля). Има ги в архива

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

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

Автор:  lz3060 [ Сря Май 20, 2009 4:14 pm ]
Заглавие: 

Здравейте пак,

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

-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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/