реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> C++ под АРМ, ошибки при линковке
Troll
сообщение Jul 17 2008, 04:44
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406



Добрый день.

Решил написать небольшую программу на С++ (никаких фундаментальных задач, пока просто для изучения).

Взял маленький проект состоящий из файлов cstartup.S lowlevel.c syscalls.c (для ф-ии printf) и собственно main.c

Все это компилится и собирается и даже работает, если используется обычный С.

Переименовываю main.c в main.cpp изменяю makefile для компилятора C++ и начинается веселье.

Компиляция проходит нормально (без ошибок и предупреждений), а вот линкер выдает ошибки: "undefined reference to `(здесь имя функции)'" и такие ошибки для всех функций, которые реализованы в main.cpp.

выписка из "Cross Reference Table".
в случае, если собирался проект на С:
dabt_handler main.o
cstartup.o

в случае, если собирался проект на С++:
dabt_handler cstartup.o
dabt_handler() main.o

Аналогично для других функций.

То есть, во втором случае функции используемые в файлах разные 07.gif , чем и объясняются ошибки при линковке.

тех. данные: контроллер АТ91SAM7A3, компилятор arm-elf-gcc, arm-elf-g++
Опции компилятора и линковщика:
для обычных файлов: arm-elf-gcc -c -g -mcpu=arm7tdmi -Wall -I./include -DAT91SAM7A3 lowlevel.c -o lowlevel.o
для ++ файлов: arm-elf-g++ -c -mcpu=arm7tdmi -I./include -gdwarf-2 -fdata-sections -Wall -Wcast-align -Wimplicit -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow -Wunused -Wa,-adhlns=main.lst -fno-rtti -fno-exceptions main.cpp -o main.o
линковщик: arm-elf-gcc -Wl,--cref -nostartfiles -T elf32-littlearm.lds -lc -lgcc -lstdc++ -Ttext 0x100000 -Tdata 0x200000 -n -o DUT_flash.elf cstartup.o lowlevel.o syscalls.o main.o

Кто знает как бороться с данной проблемой, поделитель опытом.

Спасибо.


--------------------
Hemos Pasado
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 17 2008, 07:39
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Troll @ Jul 17 2008, 07:44) *
Переименовываю main.c в main.cpp изменяю makefile для компилятора C++ и начинается веселье.
Если я правильно понял, то вы столкнулись с проявлением name mangling. Что это такое - найдете гуглей. Вкратце рецепт борьбы такой - все функции, которые находятся не в С++ файлах (а в С, асм, и т.д.), должны в С++ -файлах быть описаны с квалификатором extern "C". Соответственно и вызывать "плюсатые" функции из С или асма напрямую нельзя. Для них в С++-файле надо писать примерно такую обертку:
Код
int cpp_func(int arg); // эту функцию хотим вызывать из С или асм кода
extern "C" int cpp_func_wrapper(int arg) // а реально вызывать будем эту
{
    return cpp_func(arg);
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Troll
сообщение Jul 18 2008, 03:51
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406



Спасибо, Сергей.

Это то, что было нужно. Все заработало. a14.gif


--------------------
Hemos Pasado
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01368 секунд с 7
ELECTRONIX ©2004-2016