|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 5:13 pm
|
Страница 1 от 1
|
[ 9 мнения ] |
|
[разрешен] avr-g++ и pure virtual functions проблем
| Автор |
Съобщение |
|
lz3060
Ранг: Минаващ
Регистриран на: Сря Авг 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 |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
Здравей,
информация за компилатора може да търсиш в документацията на GCC.
http://gcc.gnu.org/onlinedocs/
Не съм GNU гуру, но имам бегли спомени за същия проблем само че с arm-elf-gcc. Не си спомням вече какво беше решението при мен. Но ето няколко насоки. Опитай да линкваш с stdc++. Добавяш ключа "-lstdc++" след "-lm" при линкването.
За заобикаляне на проблема може да пробваш фиктивна дефиниция на __cxa_pure_virtual и по този начин - добавяш в линкер скрипта това:
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Вто Апр 28, 2009 1:16 pm |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
какво означава гърми? искаш да кажеш че еклипсето забива?
|
| Вто Апр 28, 2009 2:15 pm |
|
 |
|
lz3060
Ранг: Минаващ
Регистриран на: Сря Авг 22, 2007 3:04 pm Мнения: 48
|
Целия лог е тук: http://pastebin.com/m7b87b78aИма и разни обяснения/докатки/резултати в темата в Ардуино форума. Проблема се решава ако сложа
но се опитвам да разбера как/защо техния билд минава.
|
| Вто Апр 28, 2009 2:28 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
Е добре, нали не линкваш към core.a и т.н. както тях. undefined reference to __cxa_pure_virtual получаваш щото компилатора е създал връзка към този символ, но линкера няма къде да я върже тази връзка. При техния вариант го открива при твоя не. По принцип не вярвам да имаш проблеми със заобикалянето на проблема така както си го направил.
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Вто Апр 28, 2009 3:51 pm |
|
 |
|
lz3060
Ранг: Минаващ
Регистриран на: Сря Авг 22, 2007 3:04 pm Мнения: 48
|
Бе и аз мисля, че няма да имам проблеми, но се терзая като не разбирам какво се случва  Просто искам да знам. А и няма обяснение при тях от къде се появява, те компилират същата библиотека, и после я тъпчат в core.a.
Документацията на gcc я гледам, ама малко като теле. По конкретно, какво значи -lm като опция на линкера?
Пробвах да билд-на с еклипса с максимално близки опции на компилатора до техните (не мога да ги уеднаквя, щото средата си добавя някакви по подразбиране), обаче се предава със същата грешка ...
|
| Вто Апр 28, 2009 4:30 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
-lm ще рече, че линкваш към math библиотеката. Ключа в случая е -l библиотеката m
Между впрочем линкера има отделна документация. Търси я при binutils.
Нали си със собствен make файл? Как така добавя опции по подразбиране? Между другото реда на задаване на ключовете също има значение понякога. Например при мен -lm трябва да е преди -lstdc++. От друга страна в линкер скрипта има директива с която точно това с реда на линкване мисля че може да се избегне. Виж темата на Цецо за туулчейна на Cortex-M3, последния пост.
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Вто Апр 28, 2009 5:01 pm |
|
 |
|
lz3060
Ранг: Минаващ
Регистриран на: Сря Авг 22, 2007 3:04 pm Мнения: 48
|
Собствен Makefile, ама не съвсем. Еклипса ги генерира с automake (мисля). Има ги в архива
http://1024.cjb.net/ABox.tar.gz
Ще пробвам да съчиня мой си, ама не знам това колко време ще ми отнеме  До сега един опит имам в тая насока, и той беше 2-3 таргета, не повече от 15тина реда ...
|
| Вто Апр 28, 2009 5:25 pm |
|
 |
|
lz3060
Ранг: Минаващ
Регистриран на: Сря Авг 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 |
|
|
|
Страница 1 от 1
|
[ 9 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: Google [Bot] и 0 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|