Как скомпилировать CMake для ARM с помощью CMake

Короче, я пытаюсь перекрестно скомпилировать 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.

Ответ 1

Я очень много компилирую для устройств ARM9 с использованием CMake, и действительно, похоже, что вы не связываетесь с теми же libs, которые у вас есть на вашем целевом устройстве. Вам не нужно создавать CMake самостоятельно, чтобы сделать это, так как он имеет хорошую поддержку для кросс-компиляции с версии 2.6. Просто убедитесь, что вы установили переменную CMAKE_FIND_ROOT_PATH в путь, где у вас есть точная копия корневой файловой системы, которая у вас есть на вашем целевом устройстве (с библиотеками и двоичными файлами, предварительно скомпилированными для целевого процессора). Это должно решить ваши проблемы.

В качестве побочного элемента мне нравится использовать crosstool-ng для построения моих кросс-компиляторов. Это действительно хороший инструмент, который помогает вам создавать их с нуля, поэтому я пытаюсь сопоставить версию компилятора и glibc с теми, которые первоначально использовались для создания корневой файловой системы (обычно я начинаю с готовой корневой файловой системы от ARMedslack, так как я использую Slackware для моего окна разработки и ARMedslack для моих целей ARM).