Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C++ под АРМ, ошибки при линковке
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Troll
Добрый день.

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

Взял маленький проект состоящий из файлов 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

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

Спасибо.
Сергей Борщ
Цитата(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);
}
Troll
Спасибо, Сергей.

Это то, что было нужно. Все заработало. a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.