Visual C++ for Linux Development: Практика використання для Windows розробників

enter image description here
Так вийшло, що за досить довгу кар'єру Windows Embedded розробника доля звела мене з серйозного з Linux всього лише кілька місяців тому. Потрібно було написати не дуже складну консольну програму. На той момент всі мої знання про Linux були взяті з курсу за операційним системам у внз (10 років тому). Але Stackoverflow, google і досвід дозволили досить швидко впоратися із завданням. У результаті все було написано в Visual Studio Code під Ubuntu 14.04. Правда, додаток під Linux було лише невеликою клієнтом для Windows сервера. Тому результат не дуже задовольняв мене, так як був відірваний від основного проекту в Visual Studio. І тільки зараз я зміг перенести код в основний проект з допомогою Visual C++ for Development Linux. У процесі мені довелося вирішити ряд супутніх проблем. Про це я розсаджені під катом.
Отже, Visual C++ for Development Linux — це розширення для Visual Studio, що дозволяє писати код у звичної багатьом IDE під Windows, а налагоджувати його прямо в цільової операційної середовищі Linux. При цьому використовується GCC та Remote GDB Debugger. Більш детально про розширення можна прочитати в блозі розробників або перекладі на хабре.
Інструкції щодо того, як встановити, запустити, налаштувати і т. д. можна знайти за посиланнями вище. У мене з цим не виникло ніяких проблем. Питання почалися з боку системи Linux. Нагадаю, що я використовую Ubuntu 14.04 LTS і подальший виклад піде саме про неї. Якщо кому цікаво, я використав образ для VirtualBox з сайту osboxes.org.
Так само, прошу сильно мене не лаяти, я все-таки в Linux далеко не гуру. Краще підкажіть, якщо що-то можна зробити більш оптимальним шляхом.
Налагодження першої програми
Перед тим, як використовувати віддалену налагодження, потрібно встановити кілька компонентів на системі Linux. Як зазначено в інструкціях по посиланню вище, це можна зробити, виконавши в командному рядку наступне:
sudo apt-get install openssh-server g++ gdb gdbserver

Викликати термінал в Ubuntu можна комбінацією клавіш Ctrl+Alt+T.
enter image description here
Я не пам'ятаю, запускається все це господарство відразу чи ні, тому на всяк випадок можна перезавантажитися.
Якщо все зроблено правильно, то буде відкритий порт 22. Перевірити це можна за допомогою команди
nmap
.
enter image description here
Але відразу підключитися з-під Visual Studio у мене не вдалося, так як система чомусь не пускала мене під єдиним користувачем. Довелося створити іншого. Це можна зробити в System Settings->User Account.
enter image description here
При цьому, не забувши натиснути кнопку Unlock у верхньому правому кутку.
enter image description here
Налаштувати підключення в Visual Studio можна у вікні Tools->Options
enter image description here
Тепер можна запустити і налагодити тестовий проект.
enter image description here
При цьому в Ubuntu будуть скопійовані исходники і зібраний файл програми (якщо це не відключена в налаштуваннях проекту). Все це можна буде знайти в папці /home/<ім'я користувача>/projects.
У моєму випадку вийшло ось так:
enter image description here
Запустити програму в самому Linux можна з консолі:
enter image description here
Тепер начебто можна починати працювати. Я переніс вихідні файли в Visual Studio і… нічого у мене не скомпилировалось. Виявилося, що проектом не дістає .h файли include directories.
Підключаються файли
Разом з Visual C++ for Linux Development встановлюється і безліч заголовних файлів. Їх можна знайти тут:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr

Але моїм проектом цього не вистачило.
блозі розробників з цього приводу сказано наступне:
Getting your include files
Кожен любить IntelliSense, but we're not yet synchronizing the include files from your Linux system. Everyone has their own ways to either share or copy these files which is great.

В майбутньому цю проблему обіцяють вирішити, ну а зараз крутіться як хочете. Там же наведений приклад з копіюванням всій директорії /usr/include за допомогою PuTTY.
Але мені такий шлях не подобається. Особисто я віддаю перевагу розшарити папку з заголовочными файлами. Список директорія для пошуку include файлів можна подивитися, виконавши в консолі команди
$ a touch.c
$ gcc -v -E a.c

enter image description here
Мені вистачило папки
/usr/include
.
У випадку з моєю версією системи, перед тим як розшарити дану папку, потрібно перевести її у володіння поточному користувачу. Робиться це командою
sudo chown -R osboxes:test '/usr/include'
.
Після цього можна відкрити доступ до папки. Як це зробити написано тут.
Після цього, мережеві шляхи можна прописати в Visual Studio як Include Directories.
Такий підхід має перевагу у вигляді того, що ви будете працювати завжди з оригінальними заголовочными файлами і вам не потрібно буде нічого синхронізувати. З іншого боку, будуть проблеми при переносі розробки на інший комп'ютер. Так само, як я вже писав, я працюю з Ubuntu, встановленої на віртуальній машині на моєму комп'ютері. При такій конфігурації, проблеми з безпекою відходять на другий план.
Але в інших конфігураціях, дії, описані мною вище, можуть бути заборонені.
таким чином, проблему синхронізації заголовних файлів потрібно вирішувати, виходячи з умов роботи. Тут вибір залишається за вами.
Додаткові команди компілятора і лінкера
Відмінності файли стали видні і компіляція пройшла успішно. Але ось слинковаться проекту не вдалося. Справа в тому, що я використовую потоки і заголовковий файл "pthread.h". Для того, щоб лінкер побачив бібліотеку pthread, потрібно використовувати опцію -pthread або -lpthread.
Для цих цілей в Visual C++ for Development Linux є спеціальна настройка:
enter image description here
Але в мене чомусь вона не працює. Проблема ця тимчасова (розробники вже знають про це), але вирішувати її потрібно тут і зараз. Обійти цю помилку можна використовуючи іншу опцію:
enter image description here
Якщо місце g++ написати g++ -pthread, то вийде правильна рядок лінкера:
enter image description here
enter image description here
Той же трюк спрацьовує і для компілятора.
Запуск налагодження з правами адміністратора
Тепер все скомпилировалось і слинковалось. Однак для роботи програми потрібні підвищені права, так як вона відкриває файл пристрою введення. Відповідно, налагодження так само потрібно запускати з правами адміністратора. Зараз в Visual C++ for Development Linux ця опція не реалізована, але є одне рішення.
Можна підвищити в правах gdb і gdbserver командами
$ sudo chmod ugo+s /usr/bin/gdb
$ sudo chmod ugo+s /usr/bin/gdbserver

Таку пораду можна знайти в коментарях до посту блозі розробників.
Цей трюк працює, але він не безпечний. По суті, ви надаєте свою систему любому, хто підключається до gdbservr. В моїй конфігурації це не страшно, так як все запущено на одному моєму комп'ютері, але в інших умовах потрібно бути дуже обережними з такими діями.
Копіювання додаткових файлів
І залишився останній момент. Моя програма читає параметри з текстового файлу. Він є частиною проекту Visual Studio і при компіляції повинен копіюватися у папку з виконуваним файлом.
Це можна зробити в налаштуваннях проекту:
enter image description here
Щоб просто скопіювати файл, як інші вихідні коди, його можна додати в поле Sources To Copy: @(SourcesToCopyRemotely);config.txt
А скопіювати його в іншу директорію можна з допомогою Additional Sources To Copy.
Формат цієї налаштування
fulllocationpath1:=fullremotepath1;fulllocationpath2:=fullremotepath2

і т. д.
У моєму випадку така рядок виглядає так:
$(ProjectDir)config.txt:=$(RemoteOutDir)config.txt;

Все б добре, але і тут у мене виникли проблеми.
Справа в тому, що макрос $(RemoteOutDir) розкривається в шлях, що починається з символу "~".
Судячи з усього, цей шлях зав'язаний з цією настройкою:
enter image description here
Так от, при компіляції все працює добре. Але ось при копіюванні файлів чомусь ~ сприймається не як директорія root, а просто як ім'я папки. Тобто створюється папка з ім'ям "~":
enter image description here
Впоратися з цим мені так і не вдалося, тому я просто копіював файл config.txt вручну. Правда, для цього довелося знову використовувати зміну прав на папку:
sudo chown -R osboxes:test '/home/test'
у підсумку
Особисто я можу сказати, що Visual C++ for Linux Development extension мені допоміг. Не дивлячись на всі проблеми і пару багів, він дозволив мені швидше та ефективніше вирішити завдання, пов'язане з розробкою під Linux.
Напевно, можна на це заперечити, що є більш зручні шляхи, але я виходив тільки з свого досвіду і знань, а все це в основному пов'язано з Windows.
p.s. Нещодавно в мережі з'явилося відео від MSP Олександра Поповкіна (@Catharsis96), де він так само робить огляд даного доповнення.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.