Кросскомпиляция с помощью CMake

Компилировать программу будем под популярнейшую платформу 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *