Расширение Visual C++ for Linux Development позволяет создавать решения на C++ для серверов, настольных ПК и устройств под управлением Linux. Управлять подключениями к ним можно непосредственно в Visual Studio. VS будет автоматически копировать и удалённо собирать исходный код программ. Также среда позволяет запустить ваше приложение в режиме отладки. Система управления проектами поддерживает создание решений для конкретных архитектур, в том числе APM. Под катом мы расскажем, как начать работу с новыми проектами для Linux.
Пока расширение поддерживает только удалённую сборку на целевом компьютере с Linux. Ограничений на дистрибутив Linux нет, но в системе должны быть установлены определённые инструменты. В частности, вам потребуются openssh-server, g++, gdb и gdbserver. Установите их с помощью любого диспетчера пакетов. Например, в системах, основанных на Debian, для этого можно воспользоваться командой:
sudo apt-get install openssh-server g++ gdb gdbserver
Оглавление
- Установка
- Ваш первый Linux-проект в VS
- Свойства проектов Linux
- Окно консоли
- IoT-проекты для Linux
- Как работать с платой Intel Edison посредством расширения VC++ for Linux
- Классические приложения
- Шаблон проекта Makefile
- Советы по использованию
- Подробный журнал сборки
- Где взять подключаемые файлы
- Управление копированием удалённых файлов
- Переопределение пути к компилятору C/C++
- События сборки
- Варианты отладки
- Полезные ссылки
Установка
Скачайте расширение Visual C++ for Linux Development или установите его с помощью диспетчера расширений Visual Studio.
Чтобы начать работу, создайте новый проект и выберите Templates > Visual C++ > Cross Platform > Linux.
На данный момент доступны три шаблона: Blink (для устройств Интернета вещей — например, Raspberry Pi), Console Application (консольное приложение, практически пустой каркас для вашего кода) и Empty (пустой шаблон для самостоятельного добавления файлов с исходным кодом и настроек).
Ваш первый Linux-проект в VS
Для начала создадим консольное приложение. Создайте проект на основе этого шаблона и добавьте точку останова на строке printf. Потом нажмите F5 или щёлкните кнопку Remote GDB Debugger. По умолчанию для консольного приложения будет выбрана конфигурация debug/x64. Если архитектура удалённого целевого компьютера — x86 или ARM, то эти настройки нужно будет изменить. В этом примере я буду использовать виртуальную машину x64 Ubuntu.
Поскольку мы впервые собираем решение для компьютера с Linux, среда запросит сведения о подключении. Соответствующая форма открывается при попытке сборки проекта.
Дополнение поддерживает авторизацию по паролю или сертификату, в том числе посредством парольных фраз с сертификатами. Информация об успешном подключении сохраняется для последующих подключений. Чтобы управлять сохраненными подключениями, выберите Tools → Options → Cross Platform → Linux. Да, пароли и парольные фразы хранятся в зашифрованном виде. В будущем обновлении мы собираемся добавить возможность подключения без сохранения данных о нём.
После подключения ваши файлы с исходным кодом будут скопированы на удалённый компьютер Linux, и расширение запустит gcc для их сборки с параметрами, указанными в свойствах проекта. После успешной сборки ваш код запустится на удалённой машине и будет работать, пока не достигнет ранее заданной точки останова.
Свойства проектов Linux
Чтобы понять, где именно на удалённом компьютере Linux развёртываются файлы, заглянем в свойства проекта.
Как указано в Remote settings, по умолчанию в качестве корневой папки на удалённом компьютере используется каталог ~/projects/, а имя удалённого каталога проекта соответствует названию нашего проекта. Если мы просмотрим содержимое каталогов на удалённом компьютере Linux, то найдём main.cpp и файлы, сгенерированные в процессе сборки, в папке ~/projects/ConsoleApplication1.
В разделе General указаны пути к выходному каталогу и промежуточным файлам. Кроме того, как вы видите, для проекта задан тип конфигурации Application. Поэтому исполняемый файл сохраняется в каталог bin/x64/Debug/ под именем ConsoleApplication1.out. Обратите внимание: доступны два других типа конфигурации — статическая и динамическая библиотека.
Окно консоли
Работать с удалёнными исполняемыми файлами можно через окно консоли. В этом окне можно просматривать результат работы программы и вводить входные данные. Чтобы активировать это окно, выберите Debug → Linux Console. Вот как это выглядит на практике.
Ниже приводится код простой программы — воспользуйтесь им, чтобы поработать с консолью самостоятельно.
#include <cstdio>
void log(char filename[], char visitor[])
{
FILE * pLog;
pLog = fopen(filename, "a");
if (pLog != NULL)
{
fputs(visitor, pLog);
fputs("n", pLog);
fclose(pLog);
}
}
int main(int argc, char* argv[])
{
if (argc != 2)
{
printf("Please pass filename as input parametern");
return 1;
}
char input[20];
printf("What IDE are you using?n");
scanf("%19[0-9a-zA-Z ]", input);
printf("%s! You can use that with me?!n", input);
log(argv[1], input);
return 0;
}
В свойствах проекта на странице Debugging в поле Command Arguments укажите имя файла. На этой странице также можно изменить рабочую папку, если ваш домашний каталог по какой-то причине не подходит.
IoT-проекты для Linux
Теперь рассмотрим работу с устройством Интернета вещей — Raspberry Pi. Расширение поддерживает любые устройства Pi под управлением Raspbian. В нашем шаблоне Blink мы будем использовать wiringPi — если у вас нет такой системы, её можно установить через apt или из исходного кода. Чтобы добавить подключение, выберите Tools → Options и в поле поиска введите Linux. Теперь нажмите Add, чтобы подключиться к устройству Raspberry Pi.
Откройте свойства проекта и в разделе Build Events найдите категорию Remote Post-Build Events.
В этих параметрах можно задать выполнение команды на удалённом компьютере Linux после завершения сборки. Данный шаблон изначально настроен так, чтобы экспортировать контакт GPIO для светодиодного индикатора — благодаря этому исполняемый файл не потребуется запускать как корень.
Теперь подключите к контакту 17 вашего Raspberry Pi светодиодный индикатор, как показано ниже.
Откройте файл main.cpp и задайте точку останова для вызова delay после первой инструкции digitalWrite. Нажмите F5. При достижении точки останова выполнение приостановится. При этом светодиод будет гореть. Продолжите выполнение кода до следующего вызова digitalWrite. На нём светодиод погаснет.
Как работать с платой Intel Edison посредством расширения VC++ for Linux
Работа с платой Intel Edison посредством расширения VC++ for Linux практически не отличается от использования других систем Linux. В первую очередь необходимо настроить плату в соответствии с инструкциями от Intel. После подсоединения Edison к сети Wi-Fi вы сможете подключиться к нему с помощью нашего диспетчера подключений. Если требуется подсоединиться к Edison напрямую, воспользуйтесь инструкциями по подключению к Edison посредством Ethernet через USB — наш диспетчер подключений поддерживает и такой вариант.
Edison позволяет с лёгкостью начать создавать IoT-приложение, которое обрабатывает данные от датчиков. Такие устройства, как платы расширения Arduino, позволят без проблем подключать дополнительные модули, например, плату расширения Grove от Seeed Studios. Эта плата расширения поможет работать с множеством доступных датчиков Grove, не заботясь о разводке проводов для подключения к макетной плате, — вы сможете сразу приступить к написанию кода. Компания Intel выпустила библиотеку датчиков UPM, которая делает задачу ещё проще: она обеспечивает поддержку широкого спектра датчиков, в том числе Grove.
На изображении показан вычислительный модуль Edison на схеме Arduino с подсоединенной платой расширения Grove и подключенным датчиком температуры.
Создайте в Visual Studio новый проект. Выберите VC++ → Cross Platform → Linux → Empty Project. При сборке решений для Edison в качестве платформы решения нужно выбрать x86. Добавьте в проект файл C++. Воспользуйтесь кодом из примера Grove Temperature Sample от Intel. Библиотеки UPM включены в образ Yocto Linux, который используется в Edison по умолчанию, поэтому дополнительно их устанавливать не нужно. Измените параметры include, указав соответствующее расположение файлов.
#include <upm/grove.h>
После этого код можно будет собрать и выполнить. Здесь показан результат работы этого примера в режиме отладки Visual Studio. Возможно, вас смутила первая строчка вывода. Дело в том, что первая попытка чтения данных с датчиков этого типа обычно дает не совсем точный результат.
Чтобы включить IntelliSense, следуйте инструкциям ниже. Вам потребуется скопировать подключаемые файлы с Edison в локальную среду. Пока IntelliSense работает с ошибкой, которая проявляется в этом примере. В будущем обновлении это будет исправлено.
Классические приложения
Итак, мы рассмотрели создание приложений для систем без мониторов и для специализированных устройств под управлением Linux. Но как же настольные ПК? Мы подготовили для вас кое-что особенное. Сейчас мы запустим приложение OpenGL на настольном ПК под управлением Linux. Вначале убедитесь, что ваш ПК с Linux должным образом настроен для разработки OpenGL-решений. Мы использовали следующие пакеты apt: libgles1-mesa, libgles1-mesa-dev, freeglut3, freeglut3-dev.
Теперь создайте пустой Linux-проект и скачайте исходный код Spinning Cube по ссылке из обучающей статьи Жюльена Герто (Julien Guertault) про OpenGL. Распакуйте архив и добавьте main.c в ваш проект. Для использования технологии IntelliSense вам потребуется добавить заголовочные файлы OpenGL в каталоги VC++. Скачать их можно из реестра OpenGL. Теперь откройте свойства проекта и в поле Pre-Launch Command введите «export DISPLAY=:0.0».
В поле Linker Input укажите зависимости библиотек: «m;GL;GLU;glut».
Убедитесь, что в настройках удалённого подключения указан нужный компьютер.
Теперь нажмите F5.
Чтобы получить интересные результаты, можно поместить точку останова примерно на строку 80, где задаётся вращение куба (попробуйте изменить значение alpha), или на вызов KeyboardFunc, где можно просматривать значения нажатой клавиши.
Шаблон проекта Makefile
Шаблон проекта Makefile позволяет использовать на удалённом компьютере внешние системы сборки (make, gmake, CMake, сценарии bash и тому подобное). Это работает примерно так: на странице свойств проекта C++ вы можете настроить локальные пути Intellisense, затем на странице свойств удалённой сборки добавить команды (разделённые точкой с запятой), инициирующие вашу сборку на удалённом компьютере. В этом примере мы переходим в удалённый каталог, где находится сценарий сборки, и запускаем его.
Здесь объединены несколько сценариев bash, которые способны генерировать проект файла makefile на основе ваших файлов с исходным кодом с учётом структуры каталогов. В этих сценариях предполагается, что исходный код на компьютере Linux находится в каталоге, который сопоставлен Windows. Они устанавливают новый флаг в свойствах проекта, чтобы не копировать файлы удалённо. Вряд ли такой вариант подойдёт для всех задач, но он должен стать хорошей отправной точкой для крупного проекта.
Советы по использованию
Советы из этого раздела помогут вам эффективнее использовать расширение.
Подробный журнал сборки
Было множество вопросов о том, какие именно аргументы передаются GCC. Выходные данные, которые мы видим при сборке, не дают нужной информации, но есть два способа это исправить. Выполните поиск по слову «verbosity» в окне быстрого ввода или выберите Tools → Options → Projects and Solutions → Build and Run. Для настройки MSBuild Project output verbosity выберите значение diagnostic. Тогда в окне вывода при сборке будет отображаться наиболее полная информация. Так вы сможете узнать, какие именно аргументы были переданы GCC при сборке программы. Эта информация может пригодиться, если программа работает некорректно.
Где взять подключаемые файлы
Все любят IntelliSense, но синхронизацию подключаемых файлов из вашей системы Linux мы пока не реализовали. Все передают и копируют эти файлы по-своему, и это хорошо. Мы расскажем об очень простом способе: просто копируйте всю папку в локальную систему Windows через PSCP.
pscp -r root@192.168.2.15:/usr/include .
Теперь откройте свойства проекта, перейдите в раздел VC++ Directories и добавьте локальный путь.
Управление копированием удалённых файлов
На уровне файлов и проектов можно указать, требуется ли удалённо копировать файл. Благодаря этому вы можете использовать имеющиеся механизмы сборки, просто сопоставив существующие ресурсы локально и добавив их в ваш проект для редактирования и отладки.
Переопределение пути к компилятору C/C++
В окне Property Pages вы можете переопределить команды компилятора, которые будут использоваться на удалённом компьютере. Так при необходимости вы сможете выбрать конкретные версии GCC или даже другой компилятор — например, clang. Можно указать как полные пути, так и доступные команды.
События сборки
В разделе Build Events свойств проекта доступны новые типы событий — запускаемые перед сборкой и компоновкой, а также средства копирования произвольных файлов при любых событиях сборки. С помощью этих инструментов вы можете гибко управлять процессом.
Варианты отладки
Расширение поддерживает не только gdbserver, но и режим gdb, который позволяет повысить совместимость, если подходящих бинарных файлов клиента gdb для удалённой цели в Windows нет.
Кроме того, вы можете переопределить саму команду отладчика. Это удобно для отладки внешних программ, сборка которых была выполнена не в VS.
На странице Debugging в свойствах проекта вы можете указать дополнительные команды gdb, которые будут переданы отладчику перед началом его работы. Это может пригодиться, например, при разработке IoT-проектов Azure. При использовании SDK Azure IoT C на Raspberry Pi при запуске отладки может быть сгенерировано некорректное исключение. Причина заключается в особенностях взаимодействия между libcrypto и gdb. Обсуждение этого вопроса доступно здесь. Вы можете просто продолжить отладку или вообще избежать этой проблемы, передав отладчику до начала работы специальную инструкцию — в этом случае «handle SIGILL nostop noprint».
Полезные ссылки
- Список проблем расширения VC+ for Linux на Github.
- Аккаунт автора в Twitter, где можно задать ему любой вопрос.
- Страница с коллекцией расширений и отзывами.
Автор: Microsoft