Ни для кого не секрет, что 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 *.Эта программа должна быть скомпилирована в среде Linux с использованием gcc. Конечно, это всего лишь пример; по сути, речь может идти о большом проекте для Linux с сотнями тысяч файлов и налаженной системой сборки makefile, что не меняет сути предлагаемого решения.o rm -rf *.
d map dep *~ test gcc -c main.cpp Compiling test. g++ -o test main.o Rebuild done.
Наша задача — предоставить возможность редактировать программный код в 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 (все остальные настройки — по умолчанию).
В результате получится следующее дерево файлов: 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 следующую картину:
Затем, используя опцию «Выгрузить проект», выгрузите проект из решения.
Теперь откройте файл проекта для редактирования, используя опцию «Редактировать vs_test.vcxproj».
Теперь, используя «Файл-> Создать-> Файл.
», мы создаем текстовый файл и называем его 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 обратилась к 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
-
Разработка Для Google Appengine
19 Oct, 24 -
Зимбра — Работа В Команде
19 Oct, 24 -
О Пользе Времени, Проведенного С Rss-Ридером
19 Oct, 24 -
Кодигнитер 1.7.1
19 Oct, 24 -
Создавать Pdf, Не Выходя Из Браузера
19 Oct, 24