Почему я получаю ошибки компоновщика при создании проекта CMake с использованием Drake, но я четко вижу символы? - PullRequest
0 голосов
/ 15 декабря 2018

Я следовал инструкциям Установка и быстрый запуск и пишу проект CMake для использования Drake.

Я смотрю на unittest, который строит в Drake, запускаю его ион строит, работает и проходит.Однако, когда я пытаюсь использовать некоторые из этих функций в моем проекте CMake, я получаю ошибку компоновщика, такую ​​как:

undefined reference to `RigidBodyTree<double>::get_position_name(int) const'

Если я смотрю на символы в общей библиотеке Drake (например, nm -C илиobjdump -TC с grep), вижу подпись RigidBodyTree<double>::get_position_name[abi:cxx11](int).Однако, если я посмотрю в произведенном объектном коде (что приводит к сбою связи), я увижу RigidBodyTree<double>::get_position_name(int).

(Примечание: этот пост является средством для перехода с http://drake.mit.edu/faq.html на StackOverflowдля пользовательских вопросов.)

1 Ответ

0 голосов
/ 15 декабря 2018

Скорее всего, это связано с несовместимостью компилятора, используемого для создания Drake (например, clang), и компилятором, выбранным CMake (например, gcc-4.9).В частности, gcc-4.9 или ранее не склонны хорошо обрабатывать DualABI при связывании с clang -компилированным кодом ( ref ).Вы можете использовать другие функции, поскольку только те функции, которые возвращают ABI-зависимый класс (например, std::string), помечены тем ABI, который они используют (поскольку их нельзя различить в сигнатуре функции).

Исправлено изменение компилятора, который использует CMake.Один из способов сделать это - установить переменные окружения CC и CXX для использования поддерживаемого компилятора.Список поддерживаемых компиляторов см. В Поддерживаемые конфигурации .Если вы используете предварительно скомпилированные двоичные файлы, пожалуйста, обратитесь к Двоичные пакеты для используемых компиляторов.

ВНИМАНИЕ: НЕ меняйте компилятор с помощью update-alternatives в Ubuntu, так как это может повлиять на вашСовместимость модуля DKMS с ядром (между прочим) ( ref ).

...