![](https://habrastorage.org/files/1e6/dfd/e43/1e6dfde4311647a1b303c4bf2c3d87ba.jpg)
Пока расширение поддерживает только удалённую сборку на целевом компьютере с 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.
![](https://habrastorage.org/files/14b/07b/fb8/14b07bfb86b74594bd062b2be544c662.png)
На данный момент доступны три шаблона: Blink (для устройств Интернета вещей — например, Raspberry Pi), Console Application (консольное приложение, практически пустой каркас для вашего кода) и Empty (пустой шаблон для самостоятельного добавления файлов с исходным кодом и настроек).
Ваш первый Linux-проект в VS
Для начала создадим консольное приложение. Создайте проект на основе этого шаблона и добавьте точку останова на строке printf. Потом нажмите F5 или щёлкните кнопку Remote GDB Debugger. По умолчанию для консольного приложения будет выбрана конфигурация debug/x64. Если архитектура удалённого целевого компьютера — x86 или ARM, то эти настройки нужно будет изменить. В этом примере я буду использовать виртуальную машину x64 Ubuntu.
![](https://habrastorage.org/files/3cf/23c/a57/3cf23ca576e741b89914b0cce14ca824.gif)
Поскольку мы впервые собираем решение для компьютера с Linux, среда запросит сведения о подключении. Соответствующая форма открывается при попытке сборки проекта.
![](https://habrastorage.org/files/840/656/9ed/8406569ed2d24b5ab7f9053ad6794379.png)
Дополнение поддерживает авторизацию по паролю или сертификату, в том числе посредством парольных фраз с сертификатами. Информация об успешном подключении сохраняется для последующих подключений. Чтобы управлять сохраненными подключениями, выберите Tools > Options > Cross Platform > Linux. Да, пароли и парольные фразы хранятся в зашифрованном виде. В будущем обновлении мы собираемся добавить возможность подключения без сохранения данных о нём.
После подключения ваши файлы с исходным кодом будут скопированы на удалённый компьютер Linux, и расширение запустит gcc для их сборки с параметрами, указанными в свойствах проекта. После успешной сборки ваш код запустится на удалённой машине и будет работать, пока не достигнет ранее заданной точки останова.
![](https://habrastorage.org/files/997/e14/53e/997e1453e5974401b5562927cf4dc447.png)
Свойства проектов Linux
Чтобы понять, где именно на удалённом компьютере Linux развёртываются файлы, заглянем в свойства проекта.
![](https://habrastorage.org/files/fe0/0fd/385/fe00fd385cbe4d7d8f48919e4715d36d.png)
Как указано в Remote settings, по умолчанию в качестве корневой папки на удалённом компьютере используется каталог ~/projects/, а имя удалённого каталога проекта соответствует названию нашего проекта. Если мы просмотрим содержимое каталогов на удалённом компьютере Linux, то найдём main.cpp и файлы, сгенерированные в процессе сборки, в папке ~/projects/ConsoleApplication1.
![](https://habrastorage.org/files/539/437/759/5394377599534065a70d0eba6d0cd452.gif)
В разделе General указаны пути к выходному каталогу и промежуточным файлам. Кроме того, как вы видите, для проекта задан тип конфигурации Application. Поэтому исполняемый файл сохраняется в каталог bin/x64/Debug/ под именем ConsoleApplication1.out. Обратите внимание: доступны два других типа конфигурации — статическая и динамическая библиотека.
Окно консоли
Работать с удалёнными исполняемыми файлами можно через окно консоли. В этом окне можно просматривать результат работы программы и вводить входные данные. Чтобы активировать это окно, выберите Debug > Linux Console. Вот как это выглядит на практике.
![](https://habrastorage.org/files/fba/d86/dca/fbad86dca8aa4730bd5ca144df2a7754.gif)
Ниже приводится код простой программы — воспользуйтесь им, чтобы поработать с консолью самостоятельно.
#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 parameter\n");
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 укажите имя файла. На этой странице также можно изменить рабочую папку, если ваш домашний каталог по какой-то причине не подходит.
![](https://habrastorage.org/files/8b2/1ce/175/8b21ce1756524f84823a0f217aa93841.gif)
IoT-проекты для Linux
Теперь рассмотрим работу с устройством Интернета вещей — Raspberry Pi. Расширение поддерживает любые устройства Pi под управлением Raspbian. В нашем шаблоне Blink мы будем использовать wiringPi — если у вас нет такой системы, её можно установить через apt или из исходного кода. Чтобы добавить подключение, выберите Tools > Options и в поле поиска введите Linux. Теперь нажмите Add, чтобы подключиться к устройству Raspberry Pi.
![](https://habrastorage.org/files/d1d/d5e/b82/d1dd5eb82f4b462683e275fd29322f85.gif)
Откройте свойства проекта и в разделе Build Events найдите категорию Remote Post-Build Events.
![](https://habrastorage.org/files/141/76c/19b/14176c19b4ce46c687a4480d1bf08111.png)
В этих параметрах можно задать выполнение команды на удалённом компьютере Linux после завершения сборки. Данный шаблон изначально настроен так, чтобы экспортировать контакт GPIO для светодиодного индикатора — благодаря этому исполняемый файл не потребуется запускать как корень.
Теперь подключите к контакту 17 вашего Raspberry Pi светодиодный индикатор, как показано ниже.
![](https://habrastorage.org/files/e68/ec3/c75/e68ec3c75805419e9e398be7833d9e9c.png)
Откройте файл 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 и подключенным датчиком температуры.
![](https://habrastorage.org/files/34b/d01/802/34bd018020314599b80efd6507655bc8.jpg)
Создайте в 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. Возможно, вас смутила первая строчка вывода. Дело в том, что первая попытка чтения данных с датчиков этого типа обычно дает не совсем точный результат.
![](https://habrastorage.org/files/1ba/45a/365/1ba45a365ba84fa49b4da5222d427607.png)
Чтобы включить 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».
![](https://habrastorage.org/files/263/593/79c/26359379c613415f8e63a2b81dd802aa.png)
В поле Linker Input укажите зависимости библиотек: «m;GL;GLU;glut».
Убедитесь, что в настройках удалённого подключения указан нужный компьютер.
![](https://habrastorage.org/files/528/1ce/bcf/5281cebcf7ea4a1ab27d90bf8798f6b1.gif)
Теперь нажмите F5.
![](https://habrastorage.org/files/cb6/cba/01b/cb6cba01b86646a58aadf4a05b30078d.gif)
Чтобы получить интересные результаты, можно поместить точку останова примерно на строку 80, где задаётся вращение куба (попробуйте изменить значение alpha), или на вызов KeyboardFunc, где можно просматривать значения нажатой клавиши.
Шаблон проекта Makefile
Шаблон проекта Makefile позволяет использовать на удалённом компьютере внешние системы сборки (make, gmake, CMake, сценарии bash и тому подобное). Это работает примерно так: на странице свойств проекта C++ вы можете настроить локальные пути Intellisense, затем на странице свойств удалённой сборки добавить команды (разделённые точкой с запятой), инициирующие вашу сборку на удалённом компьютере. В этом примере мы переходим в удалённый каталог, где находится сценарий сборки, и запускаем его.
Здесь объединены несколько сценариев bash, которые способны генерировать проект файла makefile на основе ваших файлов с исходным кодом с учётом структуры каталогов. В этих сценариях предполагается, что исходный код на компьютере Linux находится в каталоге, который сопоставлен Windows. Они устанавливают новый флаг в свойствах проекта, чтобы не копировать файлы удалённо. Вряд ли такой вариант подойдёт для всех задач, но он должен стать хорошей отправной точкой для крупного проекта.
![](https://habrastorage.org/files/f72/473/c55/f72473c552f14224a701c28426ddfdba.png)
Советы по использованию
Советы из этого раздела помогут вам эффективнее использовать расширение.
Подробный журнал сборки
Было множество вопросов о том, какие именно аргументы передаются 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 и добавьте локальный путь.
Управление копированием удалённых файлов
На уровне файлов и проектов можно указать, требуется ли удалённо копировать файл. Благодаря этому вы можете использовать имеющиеся механизмы сборки, просто сопоставив существующие ресурсы локально и добавив их в ваш проект для редактирования и отладки.
![](https://habrastorage.org/files/0b6/b32/924/0b6b32924fb64653b35c37f3c6999278.png)
Переопределение пути к компилятору C/C++
В окне Property Pages вы можете переопределить команды компилятора, которые будут использоваться на удалённом компьютере. Так при необходимости вы сможете выбрать конкретные версии GCC или даже другой компилятор — например, clang. Можно указать как полные пути, так и доступные команды.
![](https://habrastorage.org/files/5a2/a18/cfe/5a2a18cfe27c42f38e06caff4c6dd9e0.png)
События сборки
В разделе Build Events свойств проекта доступны новые типы событий — запускаемые перед сборкой и компоновкой, а также средства копирования произвольных файлов при любых событиях сборки. С помощью этих инструментов вы можете гибко управлять процессом.
![](https://habrastorage.org/files/1cd/e9c/1c2/1cde9c1c2f044ca688d9f12c5c54dad9.png)
Варианты отладки
Расширение поддерживает не только gdbserver, но и режим gdb, который позволяет повысить совместимость, если подходящих бинарных файлов клиента gdb для удалённой цели в Windows нет.
![](https://habrastorage.org/files/1b6/5ed/eba/1b65edebacd64273958470a3aa75f3b3.png)
Кроме того, вы можете переопределить саму команду отладчика. Это удобно для отладки внешних программ, сборка которых была выполнена не в VS.
![](https://habrastorage.org/files/bbd/8ae/1d5/bbd8ae1d5c8c4f79b0db416259bd94f1.png)
На странице Debugging в свойствах проекта вы можете указать дополнительные команды gdb, которые будут переданы отладчику перед началом его работы. Это может пригодиться, например, при разработке IoT-проектов Azure. При использовании SDK Azure IoT C на Raspberry Pi при запуске отладки может быть сгенерировано некорректное исключение. Причина заключается в особенностях взаимодействия между libcrypto и gdb. Обсуждение этого вопроса доступно здесь. Вы можете просто продолжить отладку или вообще избежать этой проблемы, передав отладчику до начала работы специальную инструкцию — в этом случае «handle SIGILL nostop noprint».
![](https://habrastorage.org/files/0b6/c0b/680/0b6c0b680c0c4db6b907178779c6b999.png)
Полезные ссылки
Комментарии (35)
sborisov
19.01.2017 18:43По мне так полноценная среда под Linux это Clion.
melon
19.01.2017 19:32+3да, CLion не плох, жаль только тормозит на больших проектах пока что и gdb в нём порой глючит у меня на многопоточных приложениях. Но активно пилят его, что радует.
klirichek
20.01.2017 09:53Полноценная? Для отладки и сборки — да. А вот непосредственно для работы с кодом — с оговорками. Например, студия очень шустро работает с мегабайтным исходником (собственно, потому он в итоге и народился, что ничего не тормозит). А в CLion любое телодвижение тут же греет процессор, и обновление экрана становится медленным и печальным. Смотреть на это уже грустно, а если ещё и работать, то вообще никак.
sborisov
19.01.2017 18:45+1VS без visual assista от tomato, и с ним это совсем 2 разные среды.
DistortNeo
19.01.2017 19:37+1В последних версиях VS IntelliSence очень неплохо доработали. Если в VS2010 и VS2012 я и представить себе не мог разработку на C++ без Visual Assist, то начиная с VS2015 я от него просто отказался.
Alex_ME
20.01.2017 00:20Пользуюсь 2015, но мне кажется, что для C++ очень скромные рефакторинги, особенно по сравнению с таковыми в C#. Либо не нашел, либо из доступного разве что переименование.
Скажите, Visual Assits не конфликтует с решарпером?DistortNeo
20.01.2017 00:53Да, переименование и облегчение работы с definition-declaration. Но я не адепт автоматических рефакторингов, даже в C# использую только переименование. Фактически, мне нужна подсветка синтаксиса, нормальное ненавязчивое автодополнение и поиск по символам. Поэтому ни решарпером, ни ассистом я в итоге не пользуюсь — не вижу в них необходимых для себя функций.
Alex_ME
20.01.2017 01:02Нормальная подсветка синтаксиса в и полностью рабочее автодополнение для C++ появилось в VS 2013.
Я раньше тоже не пользовался решарпером, но после того, как попробовал… Я освоил малую его часть, но и она мне очень помогает от рутинных действий.
Ненавязчивая реклама решарпера— Автокомплит по неподключенным пространствам имен и их автоматическое подключение — как вAndroid StudioIDEA (наверное, главное чем пользуюсь)
— Изменение сигнатуры функции с исправлением интерфейса и наоборот
— Подсветка ошибок и автокомлит представлений и методов контроллеров в ASP.NET. К примеру, не создал представление — return View() будет подсвечено. Несоответствие типа модели представления и передаваемой модели. Автокомплит действий и контроллеров в Url.Action и подобных вещах.
— быстрое создание классов\интерфейсов без открытия вечно глючащего окна шаблнов
— автоматическое переименование с поиском по комментариям, представлениям итп. Но это самая глючная функция — надо внимательно читать, что он хочет напереименовывать.
AxisPod
20.01.2017 05:05К сожалению поглядел на последний Resharper C++, да, он тормозит на гигантских проектах. Но к сожалению Visaul Assist как-то не очень развивается. Сейчас выбрал для себя решарпер, ну как-то удобнее.
Shamov
19.01.2017 18:49+1Наконец-то! Теперь ждём расширения для Xcode, которое будет подключаться удалённо к Visual C++ через RDP, интегрироваться с IntelliSense и парсером проектов *,vcxproj, а затем компилировать и запускать всё ещё более удалённо — на Raspberry Pi через ssh.
x893
19.01.2017 19:39Под Rpi всё отлично компилируется и отлаживается.
Есть способ делать сборку на локальном компьютере под Linux эмулятором, а получившийся файл отлаживать удаленно (с копированием только elf)? Запустить C:\Windows\System32\bash.exe ~ с какими то параметрами, так как на удаленном нет gcc и прочего — только gdbserver.
Alex_ME
20.01.2017 00:20Может ли в качестве удаленной системы выступать Linux Subsystem на этой же машине?
kekekeks
20.01.2017 04:13+1Они бы вместо всей этой машинерии дали возможность просто запустить произвольный GDB с произвольным набором инициализационных команд. Сейчас это можно сделать только из студийной консольки, написав туда довольно длинную команду, которой нужно скармливать XML-файл. Ну очень неудобно с заливкой прошивок и дальнейшей отладкой через STLink работать.
trigun27
20.01.2017 09:16Интересно, интересно. Во всяком случае теперь для некоторых программистов, которые «боялись» кодить на linux появился хороший инструмент. Надо будет попробовать. Особенно радует генерация make файлов.
NelSon29
20.01.2017 09:16Было бы хорошо добавить возможность собирать приложения армовым тулчейном под windows, а отлаживаться средствами VS. Чувствую, что в больших проектах на пересборку будет тратиться куча времени
ProstoTyoma
20.01.2017 09:43+2Посмотрите в сторону VisualGDB. Позволяет собирать проекты, заливать на девайс и отлаживать под кучей разных платформ. Использовал его для BeagleBone.
NelSon29
20.01.2017 10:01Знаю о таком, спасибо. При использовании показался очень тяжеловесным и неповоротливым.
evnuh
Можно считать, что у нас появилась нормальная полноценная IDE для разработки на С++ под linux?
shedward
А чем QtCreator/CLion/NetBeens/KDevelop/… не полноценны?
Wedmer
QTCreator потихоньку портится (с точки зрения разработки без использования QT). Да и модель кода теперь фигово работает.
Wedmer
Ну да, видимо увеличение времени построения модели кода в сотню раз всех удовлетворяет. Раньше разбор проекта был почти моментальным. Теперь при открытии исходников приходится ждать.
Но аргументов против этого нет, только ненависть, как показала реакция на предыдущий комментарий.
mapron
Люди видимо не работали с clang моделью на больших проектах. Я пока скрипя зубами сижу на старой модели, а что делать?
oYASo
Под никсами или виндой? По моему ощущению, под виндой clang модель и правда работает ужасно, а под никсами — довольно неплохо.
Основные затупки появляются на большой количестве сложного шаблонного кода (у меня, например, cgal + boost + мои шаблоны просто жутко грузят clang code model). Переключение на обычную модель в данном случае ничего не решает, потому что она просто не умеет автодополнять более-менее сложный код.
Wedmer
Я вишу, в основном, на бустах. Все, что мне надо, получало автокомплит. Кстати в 4.2 как то умудрились все это дело оптимизировать. Время затупов сократилось раз в десять, но все равно ощутимо. Будем надеяться, что эти проблемы со временем решатся.
AxisPod
С проектами на несколько десятков тысяч исходных файлов работали? Как-то не то чтобы неудобно, вообще нереально неудобно, особенно после связки Visual Studio + Resharper.
oYASo
А что, десятки тысяч исходных файлов всегда нужно держать в одном дерево проекта? А разбить его на модули, вот это все?
К слову, юзаю QtCreator на 2+ ляма строк кода — вполне нормально все работает.
DistortNeo
Нет. Можно считать, что в существующей IDE под Windows появилась возможность удалённо писать и отлаживать нативные программы под Linux.
AxisPod
Хм, а разработка для серверов не подразумевает удалённую разработку? Особенно когда тестовое окружение на виртуалках, на отдельном сервере. На прошлой работе вели удалённую разработку на NetBeans и было норм.
DistortNeo
Ну так моё утверждение ничему не противоречит. Была IDE, работающая под Windows, а которой не было возможности разработки удалённо под Linux, а теперь эта возможность есть.
Им бы ещё добавить поддержку SSH для работы с GIT, а то неудобно как-то переключаться.
Dionis_mgn
Главное, чтобы не появилось недокомпилятора.