| Микроконтролери и електроника 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 и по този начин - добавяш в линкер скрипта това:
|
||||||||||
| Автор: | zaphod [ Вто Апр 28, 2009 2:15 pm ] |
| Заглавие: | |
какво означава гърми? искаш да кажеш че еклипсето забива? |
|
| Автор: | lz3060 [ Вто Апр 28, 2009 2:28 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Целия лог е тук: http://pastebin.com/m7b87b78a Има и разни обяснения/докатки/резултати в темата в Ардуино форума. Проблема се решава ако сложа
но се опитвам да разбера как/защо техния билд минава. |
|||||||||||||||||||
| Автор: | Zdrav [ Вто Апр 28, 2009 3:51 pm ] |
| Заглавие: | |
Е добре, нали не линкваш към core.a и т.н. както тях. undefined reference to __cxa_pure_virtual получаваш щото компилатора е създал връзка към този символ, но линкера няма къде да я върже тази връзка. При техния вариант го открива при твоя не. По принцип не вярвам да имаш проблеми със заобикалянето на проблема така както си го направил. |
|
| Автор: | lz3060 [ Вто Апр 28, 2009 4:30 pm ] |
| Заглавие: | |
Бе и аз мисля, че няма да имам проблеми, но се терзая като не разбирам какво се случва Документацията на 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 Ще пробвам да съчиня мой си, ама не знам това колко време ще ми отнеме |
|
| Автор: | 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/ |
|