Использование Оболочки Visual Studio 2010 Для Компиляции Проектов С Помощью Gcc В Linux

Ни для кого не секрет, что Microsoft Visual Studio 2010 — это мощная IDE, которая, помимо прочего, позволяет заменять команды сборки проекта внесением изменений в файлы .

vcxproj. Как оказалось, вы можете использовать эту функцию, чтобы заставить Visual Studio создавать проекты с использованием gcc, работающего на другом компьютере с Linux. В этом случае доступ к gcc в Linux должен происходить по сети, например через ssh. В этой статье мы расскажем вам об эксперименте, который мы провели на столь необычной настройке Visual Studio. Допустим, у нас есть программа:

   
  
  
  
  
  
  
 D:\proj\tools>plink -batch -pw 123456 [email protected] cd /mnt/hgfs/proj/; make rebuild
 rm -rf *.

o rm -rf *.

d map dep *~ test gcc -c main.cpp Compiling test. g++ -o test main.o Rebuild done.

Эта программа должна быть скомпилирована в среде Linux с использованием gcc. Конечно, это всего лишь пример; по сути, речь может идти о большом проекте для Linux с сотнями тысяч файлов и налаженной системой сборки makefile, что не меняет сути предлагаемого решения.

Наша задача — предоставить возможность редактировать программный код в Visual Studio и использовать входящие в него средства анализа кода и другие инструменты.

Для начала давайте создадим простой make-файл для этой программы: ИМЯ= тест OBJS= main.o .

СУФФИКСЫ: .

cpp .

СУФФИКСЫ: .

o все: $(NAME) чистый: rm -rf *.

o чисто все: чисто rm -rf *.

d map dep *~ $(NAME) перестроить: очистить все @eсho Восстановление завершено.

$(ИМЯ): $(OBJS) эхо Компиляция $(NAME).

g++ -o $(NAME) $(OBJS) .

cpp.o: gcc -c $*.

cpp Теперь нам нужно решить следующую задачу: код необходимо отредактировать на платформе Windows (Visual Studio) и скомпилировать на Linux. Для этого вы можете использовать виртуальные машины и общие папки.

Например, в хост-системе Windows вы можете установить любой инструмент виртуализации (Oracle VirtualBox или VMware Workstation), затем создать виртуальную машину и установить на нее Linux. В результате становится возможным одновременно работать и с Windows, и с Linux. Функция общих папок позволяет получить доступ к файлам операционной системы Windows с виртуальной машины Linux. Для VMware Workstation вы можете настроить общие папки, перенаправив, например, D:\proj\ в Linux в качестве папки proj. Затем из Windows вы можете редактировать файл программы main.c, расположенный на диске Windows D:\proj\main.c, и одновременно скомпилировать его с помощью gcc в Linux в папке /mnt/hgfs/proj/.

В Visual Studio вы можете заменить команды сборки проекта: • Сборка – сборка.

• Rebuild – очистка и сборка проекта.

• Очистить – очистка файлов проекта (удаление всех бинарных файлов).

плюс команда для запуска проекта.

Для среды Linux они будут соответствовать следующему: • Построить: сделать все • Перестроить: выполнить перестройку.

• Очистить: сделать чистым • Запустить: .

/test Наша цель — запускать в Windows так, как если бы они запускались в обычном cmd, при этом ввод/вывод команды должен быть перенаправлен обратно в Windows, если мы хотим видеть ошибки компиляции непосредственно в среде из Visual Studio. Для решения данной проблемы можно воспользоваться утилитой plink.exe (скачивается на официальном сайте www.chiark.greenend.org.uk/~sgtatham/putty/download.html ) из пакета Putty. Эта утилита может выполнить одну команду через ssh, при этом правильно перенаправив ввод/вывод на текущий терминал cmd. Допустим, Linux в виртуальной машине настроен так, что к нему можно получить доступ из Windows через ssh по IP-адресу 192.168.1.8, имя пользователя — user, пароль — 123456. Затем, запустив cmd, можно успешно выполнить команду команда в Windows: D:\proj\tools> plink -batch -pw 123456 пароль пользователя@192.168.1.8 /домашняя страница/пользователь Вывод программы сообщает нам, что «pwd» был выполнен в домашнем каталоге пользователя.

Это означает, что вы можете скомпилировать тестовую программу прямо в cmd следующим образом:

#include <stdio.h> int main() { printf("Hello world!"); fflush(stdout); getchar(); return 0; }

Теперь все, что нам нужно сделать, это интегрировать указанный метод в Visual Studio. Для этого создайте пустое решение с именем vs_test в каталоге proj. Добавим проект vs_test в созданное Решение.

Проект должен относиться к типу Makefile (все остальные настройки — по умолчанию).



Использование оболочки Visual Studio 2010 для компиляции проектов с помощью gcc в Linux



Использование оболочки Visual Studio 2010 для компиляции проектов с помощью gcc в Linux



Использование оболочки Visual Studio 2010 для компиляции проектов с помощью gcc в Linux

В результате получится следующее дерево файлов: D:\proj\main.c D:\proj\makefile D:\proj\tools\plink.exe D:\proj\vs_test\vs_test.sln D:\proj\vs_test\vs_test.suo D:\proj\vs_test\vs_test.sdf D:\proj\vs_test\vs_test\vs_test.vcxproj D:\proj\vs_test\vs_test\vs_test.vcxproj.filters D:\proj\vs_test\vs_test\vs_test.vcxproj.user Далее нам нужно добавить наш make-файл и файл main.c в проект vs_test. Для этого используйте опцию проекта «Добавить-> Существующий элемент.».

Таким образом, мы получаем в Solution Explorer следующую картину:

Использование оболочки Visual Studio 2010 для компиляции проектов с помощью gcc в Linux

Затем, используя опцию «Выгрузить проект», выгрузите проект из решения.



Использование оболочки Visual Studio 2010 для компиляции проектов с помощью gcc в Linux

Теперь откройте файл проекта для редактирования, используя опцию «Редактировать vs_test.vcxproj».



Использование оболочки Visual Studio 2010 для компиляции проектов с помощью gcc в Linux

Теперь, используя «Файл-> Создать-> Файл.

», мы создаем текстовый файл и называем его make_vs.props, помещая его в D:\proj\make_vs.props. Далее, используя тег «Импорт», мы добавим текст файла make_vs.props в vs_test.vcxproj. Для этого в файл vs_test.vcxproj добавьте строку, которая импортирует дополнительные настройки проекта из make_vs.props:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(SolutionDir).

\make_vs.props" /> <ImportGroup Label="ExtensionSettings"> </ImportGroup>

В файле make_vs.props мы можем переопределить любые настройки проекта или добавить свои.

В итоге у нас получился следующий файл make_vs.props:

<Эxml version="1.0" encoding="utf-8"?> <Project xmlns=" http://schemas.microsoft.com/developer/msbuild/2003 "> <PropertyGroup Label="RemoteBuildLocals"> <RblFolder>proj</RblFolder> <RblIncludePath>$(SolutionDir)\.

\inc\</RblIncludePath> <RblExecute>.

/test</RblExecute> </PropertyGroup> <PropertyGroup Label="RemoteBuildSettings"> <RbHost>192.168.1.8</RbHost> <RbUser>user</RbUser> <RbPassword>123456</RbPassword> <RbRoot>test_src</RbRoot> </PropertyGroup> <PropertyGroup Label="RemoteBuild"> <RbToolArgs> -pw $(RbPassword) $(RbUser)%40$(RbHost) cd $(RbRoot); cd $(RblFolder);</RbToolArgs> <RbToolExe>$(SolutionDir).

\tools\plink -batch $(RbToolArgs)</RbToolExe> <RbBuildCmd>$(RbToolExe) make all</RbBuildCmd> <RbRebuildAllCmd>$(RbToolExe) make rebuild</RbRebuildAllCmd> <RbCleanCmd>$(RbToolExe) make cleanall</RbCleanCmd> <RbExecuteCmd>$(RbToolArgs) $(RblExecute)</RbExecuteCmd> <RbIncludePath>$(RblIncludePath)</RbIncludePath> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir).

\tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir).

\tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup> </Project>

Перезагрузите проект, используя «Перезагрузить проект».

И просто нажмите F5. После этого все должно выглядеть так:

Использование оболочки Visual Studio 2010 для компиляции проектов с помощью gcc в Linux



Использование оболочки Visual Studio 2010 для компиляции проектов с помощью gcc в Linux

Ура! Сама Visual Studio обратилась к make и gcc из Linux для компиляции, а мы получили вывод gcc в окне IDE и запустили нашу тестовую программу, с которой также можно работать из Windows. Теперь кратко рассмотрим основной файл make_vs.props (начнем с конца.

).

Файл разбит на группы настроек во избежание ненужного копирования текста из одного проекта в другой (методика проверена на практике для решения более чем на сотне проектов такого типа).

Первый (фактически последний) блок — это блок настроек, который Visual Studio использует для сборки проекта, состоящий из двух дублирующих групп для конфигураций Debug и Release.

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir).

\tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir).

\tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup>

Как нетрудно догадаться, значения тегов следующие: • NMakeBuildCommandLine — команда сборки (сделать все).

• NMakeReBuildCommandLine – команда Rebuild (сделать перестроение).

• NMakeCleanCommandLine – команда очистки (очистить).

• IncludePath – список каталогов Include. Без правильного списка VS не сможет правильно обрабатывать и анализировать ваш код. • LocalDebuggerCommand – команда запуска программы после компиляции.

• LocalDebuggerCommandArguments – аргументы команды при запуске программы после компиляции.

На этом этапе все значения указаны ссылками на другие настройки.

Эту группу настроек удобно выделить в Common.props и всегда включать ее во все проекты такого типа.

Следующая группа настроек соответствует указанию команд, которые должны выполняться при сборке.

.



<PropertyGroup Label="RemoteBuild"> <RbToolArgs> -pw $(RbPassword) $(RbUser)%40$(RbHost) cd $(RbRoot); cd $(RblFolder);</RbToolArgs> <RbToolExe>$(SolutionDir).

\tools\plink -batch $(RbToolArgs)</RbToolExe> <RbBuildCmd>$(RbToolExe) make all</RbBuildCmd> <RbRebuildAllCmd>$(RbToolExe) make rebuild</RbRebuildAllCmd> <RbCleanCmd>$(RbToolExe) make cleanall</RbCleanCmd> <RbExecuteCmd>$(RbToolArgs) $(RblExecute)</RbExecuteCmd> <RbIncludePath>$(RblIncludePath)</RbIncludePath> </PropertyGroup>

Значения тегов следующие: • RbToolArgs – стандартные аргументы утилиты plink, которые будут использоваться всегда.

• RbToolExe – общее значение начала всех команд, которые будут использоваться в дальнейшем.

• RbBuildCmd – простая команда сборки.

• RbRebuildAllCmd – простая команда перестроения.

• RbCleanCmd – простая команда очистки.

• RbExecuteCmd — для запуска тестовой программы после сборки, все разделено на команду и аргументы — эта часть отвечает за аргументы.

• RbIncludePath – измененный список каталогов Include. Описанную группу настроек удобно разделить в тот же Common.props. Следующая группа настроек является общей для всех проектов, но некоторые параметры будут различаться в зависимости от настроек стенда.



<PropertyGroup Label="RemoteBuildSettings"> <RbHost>192.168.1.8</RbHost> <RbUser>user</RbUser> <RbPassword>123456</RbPassword> <RbRoot>test_src</RbRoot> </PropertyGroup>

Как видите, указано имя хоста, идентификатор пользователя и пароль, а также путь к каталогу с файлами проекта для Linux. Эти настройки удобно выделить в специальный user.props и включить его в Common.props с помощью тега Import. Последняя группа настроек касается только конкретного проекта.



<PropertyGroup Label="RemoteBuildLocals"> <RblFolder>proj</RblFolder> <RblIncludePath>$(SolutionDir)\.

\inc\</RblIncludePath> <RblExecute>.

/test</RblExecute> </PropertyGroup>

Значения тегов следующие: • RblFolder – папка, в которой расположены файлы проекта (для Linux).

• RblIncludePath – список каталогов Include (для Windows).

• RblExecute – команда для запуска.

Обратите внимание, что при каждой команде Build устанавливается ssh-соединение, что занимает некоторое время (у меня, например, это заняло около 2-5 секунд).

В результате мы смогли заставить Visual Studio собрать проект, используя makefile и gcc из Linux. Теги: #Visual Studio #GCC #ssh #отладка #Visual Studio

Вместе с данным постом часто просматривают: