Використання оболонки Visual Studio 2010 для компіляції проектів за допомогою gcc в Linux.
Ні для кого не секрет, що Microsoft Visual Studio 2010 є потужною >
Припустимо, у нас є програма:
Ця програма повинна збиратися в середовищі Linux та за допомогою gcc. Звичайно, це просто приклад, насправді мова може йти про великий проект для Linux з сотнями тисяч файлів та налагодженою системою збирання на makefile, що не змінює суті запропонованого рішення. Наше завдання - забезпечити можливість редагування коду програми в Visual Studio та використання інструментів, що входять до її складу, з аналізу коду та інших засобів. Для початку зробимо простенький makefile для цієї програми:
NAME = test OBJS = main.o
.SUFFIXES: .cpp .SUFFIXES: .o
cleanall: clean rm -rf *.d map dep *
rebuild: cleanall all @eсho Rebuild done.
$(NAME): $(OBJS) @echo Compiling $(NAME). g++ -o $(NAME) $(OBJS)
Тепер потрібно вирішити таку проблему: код має редагуватися на платформі Windows (Visual Studio), а компілюватися на Linux. Для цього можна використовувати віртуальні машини і папки, що розділяються. Наприклад, у хостовій системі Windows можна встановити будь-який засіб віртуалізації (Oracle VirtualBox або VMware Workstation), потім створити віртуальну машину та встановити Linux. В результаті з'являється можливість одночасно працювати як із Windows, так і з Linux. Функція Shared Folders дозволяє отримати доступ до файлів хостової ОС Windows із віртуальної машини Linux. Для VMware Workstation можна налаштувати shared folders, прокинувши, наприклад, D:proj в Linux як папку proj. Тоді з Windows можна редагувати файл програми main.c, що на диску Windows D:projmain.c і, при цьому,компілювати його, використовуючи gcc, в Linux у папці /mnt/hgfs/proj/.
У Visual Studio можна замінити команди збирання проекту: • Build - збирання. • Rebuild - очищення та складання проекту заново. • Clean – очищення файлів проекту (видалення всіх бінарних файлів). плюс команда для запуску проекту. Для середовища Linux вони будуть відповідати наступним: • Build: make all • Rebuild: make rebuild • Clean: make clean • Запуск: ./test
Наше завдання - запускати у Windows так, ніби вони запускаються у звичайному cmd, при цьому введення/виведення команд має перенаправлятися назад у Windows, якщо ми хочемо бачити помилки компіляції прямо в середовищі з Visual Studio. Для вирішення цього завдання можна використовувати утилітку plink.exe (завантажується на офіційному сайті www.chiark.greenend.org.uk/
Тепер нам залишається інтегрувати вказаний метод у Visual Studio. Для цього створимо порожній Solution з назвою vs_test у каталозі proj. Додамо проект "vs_test" у створений Solution. Проект повинен мати тип Makefile (всі інші параметри за замовчуванням).
В результаті вийде наступне дерево файлів:
Далі потрібно додати в проект "vs_test" наші makefile та main.c. Для цього слід скористатися опцією проекту "Add->Existing Item...". Таким чином отримаємо наступну картину в Solution Explorer:
Далі, за допомогою опції "Unload project" вивантажуємо проект із solution.
Відкриваємо на редагування файл проекту за допомогою опції "Edit vs_test.vcxproj"
Тепер за допомогою "File->New->File..." створюємо текстовий файл, і називаємо його make_vs.props, розміщуючи його в D:projmake_vs.props. Далі, за допомогою тега "Import" включимо текст файлу make_vs.props в vs_test.vcxproj. Для цього у файлі vs_test.vcxproj додамо рядок,що імпортує додаткові налаштування проекту з make_vs.props:
У файлі make_vs.props ми можемо перевизначити будь-які налаштування проекту або дописати власні. У нас вийшов такий файл make_vs.props:
Перезавантажуємо проект за допомогою "Reload project". І просто натискаємо F5. Виглядати все має після цього так:
Ура! Visual Studio для компіляції сама звернулася до make і gcc з Linux, і ми отримали у вікні IDE висновок від gcc і запустили нашу програму test, з якою можна працювати з Windows. Тепер коротко розберемо основний файл make_vs.props (почнемо з кінця..). Файл розбитий на групи налаштувань, щоб уникнути зайвого копіювання тексту з одного проекту до іншого (методика випробувана практично для Solution більш як із сотні проектів такого виду). Перший (насправді останній) блок - це блок налаштувань, які Visual Studio використовує для здійснення складання проекту, складається з двох дублюючих груп для конфігурацій Debug і Release.
Як не важко здогадатися, значення тегів такі: NMakeBuildCommandLine - команда Build (make all). • NMakeReBuildCommandLine – команда Rebuild (make rebuild). • NMakeCleanCommandLine – команда Clean (make clean). • IncludePath – список Include директорій. Без коректного списку VS не зможе нормально обробити та розпарсувати Ваш код. • LocalDebuggerCommand – команда запуску програми після компіляції. • LocalDebuggerCommandArguments – аргументи команди при запуску програми після компіляції.
Наступна група налаштувань відповідає завданням команд, які мають виконуватися під час складання. .
Значення тегів такі: • RbToolArgs - стандартні аргументи утиліти plink, які будуть використовуватися завжди. • RbToolExe- загальне значення початку всіх команд, які використовуватимуться далі. • RbBuildCmd – проста команда Build. • RbRebuildAllCmd – проста команда Rebuild. • RbCleanCmd – проста команда Clean. • RbExecuteCmd – для запуску програми test після складання все ділиться на команду та аргументи – ця частина відповідає за аргументи. • RbIncludePath - перезазначений список Include директорій.
Описану групу налаштувань зручно виділити у той же Common.props.
Наступна група налаштувань, загальна для всіх проектів, але деякі параметри відрізнятимуться залежно від налаштувань стенду.
Як можна бачити, вказано ім'я хоста, ідентифікатор користувача та його пароль, а також шлях до каталогу з файлами проектів для Linux. Ці налаштування зручно виділити у спеціальний user.props та включати його в Common.props за допомогою тега Import. Остання група налаштувань стосується лише конкретного проекту.
Значення тегів такі: • RblFolder - папка, де знаходяться файли проекту (Linux). • RblIncludePath – список Include директорій (для Windows). • RblExecute – команда для запуску.
Врахуйте, що при кожній команді Build відбувається встановлення ssh з'єднання, що вимагає деякого часу (наприклад, у мене виходило близько 2-5 секунд). У результаті нам вдалося змусити Visual Studio здійснювати складання проекту за допомогою makefile і gcc з Linux.