Первая программа на Virt2Real. C++. Кросс-компиляция

Материал из virt2real wiki
Перейти к: навигация, поиск

Оригинал статьи и обсуждение

  • Компиляция — это преобразование программы, написанной, на языке, понятному человеку (программисту), в язык, понятный машине (компьютеру).
  • Кросс-компиляция — это преобразование такой программы для платформы, отличной от той, на которой мы производим ту самую компиляцию. Так, как мы хотим запустить наш код, написанный в нашем компьютере с линуксом (в моем случае) на виртурилке (отдельной машине), то такой процесс компиляции и будет называться кросс-компиляцией.
  • Бинарник — это исполняемый машиной файл, который получился в результате компиляции или кросс-компиляции. То есть, файл, который можно уже запустить и увидеть результат его работы.
  • Makefile — это специальный файл, который позволяет автоматизировать процесс компиляции проекта.

Как мы обычно компилируем?

g++ hello.cpp -o hello

Мы скомпилировали файл hello.cpp в файл hello — тот самый бинарник, который можно запустить. Это хорошо, что наш проект состоит из одного файла, но что, если их много? Компилировать каждый файл немного неудобно. В таких случаях и используют Makefile. На самом деле у мейкфайла есть еще кое какие возможности, более подробно о нем можно почитать здесь.

SDK — комплект средств разработки. Подробнее в википедии

Поскольку у проекта Virt2Real есть свое SDK, то мы будем использовать его.

Поехали!

1. Устанавливаем на наш компьютер SDK Virt2Real по этой инструкции. Я же упустил из этой инструкции все пункты кроме 1-го из раздела «Скачивание компонентов SDK», т. к. не совсем понял зачем они.

2. После установки SDK, мы уже можем проверить как оно работает. Создаём в любом редакторе файл test.cpp с содержимым:

#include <iostream>

int main(int argc, char* argv[])
{
   std::cout << "Hello World!!!" << std::endl;
   return 0;
}

После чего нам нужно скомпилировать созданный файл под нашу виртурилку, в чем нам поможет компилятор, который входит в состав скачанного нами ранее SDK. Находясь в папке с нашим файлом, выполняем команду:

/opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-g++ test.cpp -o test

Появился новый файл test — это и есть тот бинарник, который сможет выполнить (запустить) наша виртурилка. Если же мы попытаемся запустить его здесь, то получим ошибку, ибо файл был скомпилирован под другую платформу.

Для того, чтобы выполнить данный файл на виртурилке, нужно сначала его туда залить;) Делаем это с помощью команды:

scp ./test root@192.168.2.1:/

где 192.168.2.1 — адрес виртурилки. У вас он может быть другой.

После выполнения команды, наш бинарник будет залит в корень виртурилки. Переходим в неё:

ssh root@192.168.2.1

Помним, что 192.168.2.1 — адрес виртурилки, который у вас может отличатся.

Если у вас не установлен ssh, то это можно сделать командой:

sudo apt-get install ssh

Зашли в виртурилку. Перемещаемся в корень, где должен быть наш бинарник:

cd /

На всякий случай пропишем ему необходимые права:

chmod 777 test

И запускаем:

./test

Если отобразилось наше приветствие, значит мы все сделали правильно, все работает!

3. Теперь давайте попробуем создать чуть более сложный проект — поморгать светодиодом и немного автоматизировать компиляцию с помощью файла Makefile.

Создадим наш автоматизированный Makefile с таким содержимым:

CODE: SELECT ALL
CXX=/opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-g++
TARGET=$(shell basename `pwd`)
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:%.cpp=%.o)

all: $(TARGET)

$(OBJECTS): $(SOURCES)

$(TARGET): $(OBJECTS)
   $(CXX) -o $(TARGET) $(LDFLAGS) $(OBJECTS) $(LOADLIBES) $(LDLIBS)

clean:
   $(RM) $(OBJECTS) $(TARGET)

.PHONY: all clean

где самая верхняя строчка — переменная CXX, которой мы присвоили путь к нашему компилятору.

Внимание! Отступы в Makefile делаются строго табуляцией, это имеет значение.

Данный мейкфайл будет собирать все, что находится в директории, в которую он помещен. Обратите внимание, директория (проект) должен быть назван так же, как и основной файл (в котором находится main функция). В нашем случае такая структура:

  • v2light
    • functions.h
    • Makefile
    • setlight.cpp
    • v2light.cpp

Содержимое файла functions.h:

void setlight();

Содержимое файла setlight.cpp:

#include <cstdlib>
#include <unistd.h>

void setlight() {   
   while(true) {
      //system("echo \"set gpio 74 output 1\" > /dev/v2r_gpio");
      system("echo \"set gpio74 output:1\" > /dev/v2r_gpio");
      usleep(1000000); // 1 second
      //system("echo \"set gpio 74 output 0\" > /dev/v2r_gpio");
      system("echo \"set gpio74 output:0\" > /dev/v2r_gpio");
      usleep(1000000); // 1 second
   }
}

Так как у меня ещё старая прошивка на виртурилке, я использую старый синтаксис. Если у вас новая, то расскоментируйте соответственные строки.

Содержимое основного файла v2light.cpp:

#include <iostream>
#include "functions.h"

int main(int argc, char* argv[])
{
   setlight();
   return 0;
}

Теперь попробуем скомпилировать. Для этого, находясь в директории с проектом, запустим в терминале команду

make

Либо в вашей среде разработки: Build → Make (это в моем случае (редактор Geany)). После этого, в той же директории должны появится три файла, из которых v2light и есть наш бинарник для виртурилки. Заливаем его на виртурилку:

scp ./v2light root@192.168.2.1:/

Заходим в виртурилку:

ssh root@192.168.2.1
cd /
ls

Должны увидеть наш v2light. Запустим его:

./v2light

Если красный светодиод моргает каждую секунду, значит у нас все получилось! Теперь можно приступать к более серьёзным задачам ;)

Надеюсь данная статья поможет новичкам в преодолении этого барьера, который многим не даёт почувствовать вкус от результата настоящего программирования;) Ну а на форуме появится ещё больше интересных проектов, особенно от новичков.