Короче, я пытаюсь перекрестно скомпилировать CMake с CMake, и я не думаю, что правильно свяжу библиотеки. То, что я хочу сделать, может оказаться невозможным, но я бы хотя бы хотел знать, почему это невозможно, если это дело.
Система: хост представляет собой Linux box с процессором Cavium ARM9. В настоящее время выполняется версия 2.6.24.4 ядра Linux и Debian 5.0 (Lenny). Моя рабочая станция Core i5 работает с Ubuntu 12.04 LTS (точный панголин).
Моя общая цель - получить ROS, работающий в ящике Linux. Я должен скомпилировать из источника, а не использовать apt, так как для файлов Debian 6.0 (Squeeze) требуется поддержка большого пальца, которую Cavium не дает, и не многие из необходимых пакетов доступны для Debian 5.0 (Lenny). Я добился успеха в установке различных библиотек, но когда я дошел до шага 1.3.1 и попытался запустить CMake, я получил ошибку
Требуется CMake 2.8 или выше. Вы используете версию 2.6.0
Далее я попытался загрузить и установить CMake 2.8.8 на ящик Linux, но это было слишком много для системы. Когда это не удалось, я загрузил инструментальную цепочку, предложенную на веб-сайте производителя, и использовал руководство по кросс-компиляции в [www.cmake.org/Wiki/CMake_Cross_Compiling] для создания исполняемых файлов CMake. Вот мой файл toolchain:
# This one is important
SET(CMAKE_SYSTEM_NAME Linux)
# Specify the cross compiler
SET(CMAKE_C_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-g++)
# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/arm-unknown-linux-gnu)
# Search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# For libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Однако использование двоичного кода в ящике Linux дает ошибку
cmake:/usr/lib/libstdc++.so.6: версия `GLIBCXX_3.4.14 'не найдена (требуется cmake)
Конечно, библиотеки там нет:
prompt# strings /usr/lib/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBC_2.3
GLIBC_2.0
GLIBC_2.3.2
GLIBC_2.1
GLIBC_2.1.3
GLIBC_2.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
Я никогда раньше не перекрестно скомпилировал, но я вижу один из двух сценариев: либо созданный двоичный файл был создан с ссылкой на более высокую версию glibcxx на главной машине, либо с помощью инструментальной цепочки производителя более современна, чем их образ, Я не знаю, как проверить, что происходит, или если что-то еще происходит, о котором я не знаю.
Мое последнее усилие включало попытку статически перекрестно скомпилировать CMake, чтобы надеяться избавиться от ошибки связывания с помощью
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-technologic.cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-static" ..
У меня возникли ошибки сборки, и этот двоичный файл тоже не работал. Я получил:
FATAL: kernel too old
Segmentation fault
Я бы попробовал установить glibcxx 3.4.14 в Linux, но для этого процессора он не похож.
Я пробовал искать зависимости CMake или системные требования и ничего не могу найти. Я также искал, как создать CMake, но большинство поисковых запросов показывают, как создавать другие вещи с помощью CMake, а не создавать CMake.