Попытка скомпилировать код со ссылками на оба протобуфера 2.6.1 и 3.4.1. - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь скомпилировать одну кодовую базу со ссылками на оба протобуфера 3.4.1 и 2.6.1.Теперь вариант 2.6.1 определен глобально, поскольку я использую ubuntu xenial, а также:

$ protoc --version

выход:

libprotoc 2.6.1

Требование к версии 3.4.1 протобуфера исходит от Google Cartographer(https://github.com/googlecartographer/cartographer), в то время как требование для 2.6.1 исходит от симулятора роторов (https://github.com/ethz-asl/rotors_simulator), поскольку оно опирается на Gazebo-7 (который использует протобуфер 2.6.1). Для компиляции Google Cartographer я добавилдвоичные файлы (добавленные в папку proto3, см. ниже) к установке путем адаптации файла CMakeList.txt (см. оригинальный файл здесь: https://raw.githubusercontent.com/googlecartographer/cartographer/master/CMakeLists.txt) для Google Cartographer путем добавления следующих строк:

set(CMAKE_PREFIX_PATH CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/proto3")
...
install(DIRECTORY proto3/ DESTINATION .)

Таким образом, бинарные файлы протобуфера 3.4.1 добавляются в папку установки. Я использую catkin-tools (https://catkin -tools.readthedocs.io / en / latest / ) для сборки всегорабочая область. Теперь в CMakelist.txt для Rotors Simulator у меня есть следующая строка:

find_package(Protobuf 2.6.1 REQUIRED HINTS "/usr")

Но в данный момент при попытке компиляции он не может найти протобуфер 2.4.1, так какреполучается следующее:

Could not find a configuration file for package "Protobuf" that is
compatible with requested version "2.6.1".

The following configuration files were considered but not accepted:

/home/jochem/catkin_ws/install/lib/cmake/protobuf/protobuf-config.cmake, 
version: 3.4.1

В качестве примечания, если я скомпилирую пакеты отдельно, я смогу скомпилировать и установить пакеты.Это делается с помощью следующих команд:

 catkin build cartographer_ros 

и

 catkin build rotors_gazebo_plugins

В настоящее время я пытаюсь адаптировать пакет rotors_gazebo_plugins, но пока не удается убедиться в правильном протобуферебиблиотека выбрана, я что-то упустил, определив ссылки на локальную версию протобуфера?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Если вы сможете обернуть хотя бы одну из библиотек (т.е. Cartographer или Rotors или обе) в отдельную общую библиотеку, и если protobuff используется только внутри каждой из них, вы все равно сможетеиспользовать их оба в одном исполняемом файле, создавая общие библиотеки с флагом -fvisibility=hidden gcc (чтобы переключить видимость по умолчанию на скрытие символов) и экспортируя только те символы, которые необходимы (используются приложением) через __attribute__((visibility("default"))).

Таким образом, насколько я помню, в прошлом я мог использовать две совершенно разные версии Boost в одном и том же приложении (благодаря общей библиотеке, не экспортирующей символы надстройки, связанные статически).

0 голосов
/ 06 июня 2018

Вы найдете возможность создать один исполняемый файл, который ссылается на 2 версии одной и той же библиотеки для Mac, довольно сложный для Windows и практически невозможный для Unix.Это связано с тем, что имена символов не различаются между двумя библиотеками, поэтому при загрузке обеих библиотек невозможно узнать, какая библиотека должна обслуживать какой вызов.

Если вы собираете 2 разных исполняемых файла в одном make-файлепакет, то вам просто нужно установить правильные библиотеки для загрузки на этапе ссылки.В linux библиотеки обычно устанавливаются в вашей системе с суффиксом номера версии и символической ссылкой, которая публикует последнюю версию без номера версии.Обычно вы просто ссылаетесь на неподдерживаемую последнюю версию, но в вашем случае в вашей команде link вам нужно явно добавить суффикс.

Если вам действительно нужно связать это объединение в один исполняемый файл,в Unix вы можете многое сделать с помощью objcopy --redefine-syms, чтобы переименовать все точки входа в одной из библиотек и все ссылки в зависимом коде все после компиляции, но до компоновки.Обратите внимание, что предполагаемый конечный результат заключается в том, что обе библиотеки будут работать независимо и не будут знать друг о друге.

...