Компилировать программу будем под популярнейшую платформу Raspberry Pi. Эту заметку я использую, как памятку для закрепления информации полученной из публикаций: [ Raspberry Pi C ++] Using CMake и The Useful RaspberryPi Cross Compile Guide. Поэтому код и текст будут существенно с ними перекликаться, но в своей статье я сосредоточусь на практической стороне вопроса и опущу подробности. Заинтересовавшиеся могут почитать оригинальные статьи, да и в интернете можно без труда найти, довольно, много источников по данной теме.
Подготовка
Все действия буду производить из под виртуальной машины с Ubuntu 18.04 LTS. Для начала скачаем toolchain для распбери, который, в том числе содержит компилятор. Toolchain находится на гитхабе по ссылке, соответсвующая команда в терминале:
git clone https://github.com/raspberrypi/tools
Я для своих экспериментов создал директорию PiProject куда и склонировал репозиторий.
Устанавливаем CMake:
sudo apt-get install cmake
Создадим директорию с тестовым проектом со следующей структурой:
Hello_world ├── build ├── inc | └── hello_world.h ├── src | └── hello_world.c └── CMakeLists.txt
Можно создать и любую другую структуру, но такая иерархия довольно стандарная, а также она нам понадобится для конкретики при написании файла CMakeLists.txt. Описание это файла будет ниже, а пока создадим hello_world.h/c, в соответвующих директориях.
#ifndef HELLO_WORLD_H #define HELLO_WORLD_H #include <stdio.h> #define GRETEETING_STR "Hello, World from ARM!\n" #endif // HELLO_WORLD_H
#include "hello_world.h" int main(int argc, char** argv) { printf(GRETEETING_STR); return 0; }
Сборка и запуск
Итак, пора приступить к сборке проекта. Для этого нам потребуется написать CMakeLists.txt, это файл скриптов утилиты cmake. Данная утилита имеет очень широкие возможности по сборке проектов, но я рассмотрю самые базовые.
cmake_minimum_required (VERSION 3.0) # Set ARM compiler SET(PITOOLS_PATH /home/viacheslav/PiProject/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf) SET(CMAKE_C_COMPILER ${PITOOLS_PATH}/bin/arm-linux-gnueabihf-gcc) SET(CMAKE_CXX_COMPILER ${PITOOLS_PATH}/bin/arm-linux-gnueabihf-gcc) # Name our project project (Hello_world) include_directories(include/) # Add all the *.c files in our source directory to our executable output FILE(GLOB SRC_FILES src/*.cpp src/*.c) add_executable(Hello_world ${SRC_FILES})
Командой SET устанавливаются значения различных переменных. С ее помощью прописываем пути к компилятору под архитектуру процессора Raspberry Pi.
include_directories — добавляет каталог, где лежат файлы заголовков.
FILE — добавляет переменную содержащею .c/cpp файлы.
add_executable — макрос, который говорит, что собственно нужно скомпилировать и добавить в исполняемый файл.
Настало время собрать проект для этого запустим cmake для генерации по нашему CMakeLists.txt make-файла. Перейдем в папку проекта и выполним несколько команд.
cd build/ cmake .. make
Если все сделано правильно, то после выполнения этих команд мы получим исполняемый файл Hello_world в папке build. Если мы его попробуем запустить на x86 машине получим ошибку: Exec format error. В нашем случае это хороший знак, потому что программа действительно собралась под нашу целевую платформу ARM.
Теперь нужно скопировать данный файл и на распбери.
scp Hello_world pi@192.168.1.7:/home/pi/test
Отлично, файл на целевой платформе, теперь зайдем на распбери и запустим его.
Если все нормально, то увидим заветную строку: Hello, World from ARM!
Чтобы «код» не затерялся, как обычно, выложил его на github.