Arhn - архитектура программирования

Невозможно связать объектный файл .o

У меня есть вопрос о моем текущем проекте C++ Linux. Я создаю исходный код и связываю его (IDE — это QtCreator) с файлом .o (не .lib), предоставленным поставщиком. При создании исходных файлов кажется, что все в порядке, но когда я достигаю времени компоновки, вывод командной строки указывает на множество ошибок неопределенных ссылок. Вот используемый cli и его вывод:

arm-nobuos-linux-gnueabi-g++  -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi -c -pipe  -O2 -pipe -g -feliminate-unused-debug-types -g -DLINUX=1 -Wall -W -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_CORE_LIB -I../qt_selexes_test2 -I. -isystem /opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi/usr/include -isystem /opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi/usr/include/qt5 -isystem /opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi/usr/include/qt5/QtCore -I. -I/opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi/usr/lib/qt5/mkspecs/linux-oe-g++ -o moc_mrs_flasher.o moc_mrs_flasher.cpp
arm-nobuos-linux-gnueabi-g++  -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -o qt_selexes_test2 main.o dcan.o moc_dcan.o moc_mrs_flasher.o   /SviluppoCodice/parodi/SW/updateAnalogCan_Wurth/qt_selexes_test2_20170511/qt_selexes_test2/mrs_flasher.o -lQt5Core -lpthread 
main.o: In function `main':
main.cpp:26: undefined reference to `mrs_flasher::scan_module_wait(long, int, int, unsigned char&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
main.cpp:37: undefined reference to `mrs_flasher::select_module(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
main.cpp:41: undefined reference to `mrs_flasher::download_s19_wait(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'

Глядя на файл .o, кажется, что:

  • целевая машина компилятора одна и та же (при вызове командного файла в файлах .o, сгенерированных путем компиляции моих файлов cpp и файла, предоставленного поставщиком, оба они генерируют следующий вывод ELF 32-битный LSB перемещаемый , ARM, EABI5 версии 1 (SYSV), без разделки

  • файл .o содержит неопределенные объекты, на которые ссылаются (я использовал команду strings mrs_flasher.o | grep scan_module_wait для поиска неопределенной ссылки на `mrs_flasher::scan_module_wait). вывод команды:

scan_module_wait

_ZN11mrs_flasher16scan_module_waitEliiRhRSs

_ZN11mrs_flasher16scan_module_waitEliiRhRSs )

Есть ли кто-нибудь, кто может помочь мне в дальнейшем исследовании этого вопроса? Есть ли что-то, что я могу опубликовать, чтобы помочь справиться с проблемой? Спасибо, Джованни.


Ответы:


1

Объяснение заключается в том, что предоставленный вашим поставщиком объектный файл, который, как я полагаю, /SviluppoCodice/parodi/SW/updateAnalogCan_Wurth/qt_selexes_test2_20170511/qt_selexes_test2/mrs_flasher.o, не был скомпилирован тем же компилятором, который вы используете, или компилятором, совместимым с ABI.

Вы можете видеть это из того факта, что ваш компилятор вызывает вызов:

mrs_flasher::scan_module_wait(long, int, int, unsigned char&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)

тогда как ваш объектный файл определяет искаженный символ:

_ZN11mrs_flasher16scan_module_waitEliiRhRSs

который деманглирует как:

$ c++filt _ZN11mrs_flasher16scan_module_waitEliiRhRSs
mrs_flasher::scan_module_wait(long, int, int, unsigned char&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)

Обратите внимание, что функция, которую запрашивает ваш компилятор, имеет четвертый параметр типа:

std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&

тогда как тот, который определен объектным файлом, имеет четвертый параметр другого типа:

std::basic_string<char, std::char_traits<char>, std::allocator<char> >&

Таким образом, сигнатуры функций не совпадают, и компоновщик не находит определения функции, которую вызывает ваш компилятор.

Разница между двумя сигнатурами функций:

std::__cxx11::basic_string

против:

std::basic_string

сообщает нам, что ваш компилятор компилируется в C++11 ABI, представленный в GCC 5.1, но компилятор, создавший ваш объектный файл, этого не делает.

Наиболее вероятная причина в том, что ваш провайдер создал объектный файл с помощью GCC ‹ 5.1. Вы не можете связать этот объектный файл с файлами, созданными с помощью вашего компилятора, если только вы не хотите создавать свой собственный код для устаревшего ABI, чего, я полагаю, у вас нет. Вы должны попросить своего провайдера предоставить новый, соответствующий C++11 ABI.

20.07.2017
  • Спасибо, Майк, я попробую старый подход ABI (чтобы проверить библиотеку провайдера). Затем я попрошу его пересобрать .o с помощью моего компилятора. Теперь мне нужно понять, как использовать старый ABI в QTCreator. 20.07.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..