Ещё раз о Netbeans 7.2. Удаленная разработка приложений С/С+

Так вышло, что Arch Linux стал у меня основной платформой при разработке ПО используемого в докторской диссертации. Если перенос кода основного проекта с Windows-платформы на линукс произошел быстро (управился за один вечер), то на решение сабжа понадобилось полноценных три дня головоломной работы.

Суть задачи в следующем. В настоящий момент существует программа, моделирующая движения поезда с учетом разнообразных факторов, как с фиксированным шагом интегрирования, так и в реальном масштабе времени. Для реального масштаба в воздухе давно витала идея разделить модель поезда и модель системы управления движением физически на два разных блока, реализованных на отдельных компьютерах.

Вообще в бортовой системе пассажирского локомотива ЭП20 используется система QNX, однако в связи с не выясненными глюками инсталятора инструментария QNX под арчем (он вроде только федору и ещё несколько дистрибутивов поддерживает пока) пришлось тренироваться на кошках и установить на VM VirtualBox 32-разрядный арч, гордо обозвать это БОРТОВОЙ КОМПЬЮТЕР и решить вопрос как разрабатывать ПО для этого БК сидя под 64-битном арчем на хосте.

Для разработки на С++ под арчем использую Netbeans 7.2, очень им доволен, поэтому решил запилить удаленную разработку на нем.

1. Настройка целевой системы (без использования общих папок с хостом)

В целевой системе на виртуальной машине настраиваем сеть с хостом, устанавливаем OpenSSH на гостевой системе и на хосте

#pacman -S openssh

настраиваем параметры ssh-соединения конфигурируя файлы /etc/ssh/ssh_config и /etc/sshd_config, на подробностях останавливаться не буду, ибо данная процедура крайне проста и очень хорошо задокументирована.

Кроме того ставим набор средств разработки

#pacman -S gcc glibc make

без которых сборка проекта в целевой системе будет невозможна

2. Настройка среды Netbeans

Запускаем Netbeans на хосте. Идем в меню “Окно -> Службы”. В появившемся слева списке служб выбираем “Удаленные узлы сборки С/С++”, правой кнопкой открываем меню и выюираем пункт “Добавить новый узел”. В появившемся окне вбиваем имя узла (ip-адрес) и порт, по которому работает SSH



Жмем “Далее”, в следующем окне задаем имя пользователя целевой системы и метод аутентификации по SSH



Далее вбиваем пароль пользователя гостевой системы



Смотрим сводку, она должна выглядеть вот так



В выпадающем списке “Доступ к файлам проекта” я выбрал пункт “Автоматическая копия”, ибо компиляцию через NFS или Samba настроить мне не удалось. При выбранной настройке файлы проекта переносятся по каналу SSH с хоста в целевую систему в папку ~/.netbeans/<имя узла>

Жмем “Готово”

3. Создание удаленного проекта

Идем в “Файл -> Создать проект”. В окне выбираем тип проекта “Приложение С/С++”



Далее настраиваем проект. Задаем его имя и расположение файлов на хосте и - ВНИМАНИЕ!!! - обязательно оставляем галочку “Создать главный файл проекта”, задав так же имя этого файла, иначе, при попытке создать его позже Netbeans откажется собирать проект на удаленном узле, мотивируя это отсутствием правил сборки модуля *.o в Makefile.



В качестве узла сборки выбираем созданный нами узел из выпадающего списка. Жмем “Готово”

Далее идем в файлы проекта, находим главный файл, удаляем автоматически сгенерированный код и пишем свой, например

#include <stdio.h>
int main(void) 
{
    printf("Hello from 192.168.0.103 ;)");
    
    return 0;
}

Правой кнопкой по проекту вызываем меню и жмем “Собрать”. Если система отвечает нам в духе

Копирование файлов проекта в /home/locodriver/.netbeans/remote/192.168.0.103/arch-host-Linux-x86_64/ в [email protected]:22
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/home/locodriver/.netbeans/remote/192.168.0.103/arch-host-Linux-x86_64/home/maisvendoo/netbeans/railway/remote_test'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/remote_test
make[2]: Entering directory `/home/locodriver/.netbeans/remote/192.168.0.103/arch-host-Linux-x86_64/home/maisvendoo/netbeans/railway/remote_test'
mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/remote_test.o.d
g++    -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/remote_test.o.d -o build/Debug/GNU-Linux-x86/remote_test.o remote_test.cpp
mkdir -p dist/Debug/GNU-Linux-x86
g++     -o dist/Debug/GNU-Linux-x86/remote_test build/Debug/GNU-Linux-x86/remote_test.o  
make[2]: Leaving directory `/home/locodriver/.netbeans/remote/192.168.0.103/arch-host-Linux-x86_64/home/maisvendoo/netbeans/railway/remote_test'
make[1]: Leaving directory `/home/locodriver/.netbeans/remote/192.168.0.103/arch-host-Linux-x86_64/home/maisvendoo/netbeans/railway/remote_test'
СОБРАТЬ SUCCESSFUL (общее время: 6s)

Значит всё ОК, жмем “Выполнение”, и получаем

Hello from 192.168.0.103 ;)
ВЫПОЛНЕНИЕ SUCCESSFUL (общее время: 201ms)

Всё :), можно работать.

4. Послесловие

Естественно, не обошлось и без проблем, в которых прошу помочь сообщество:

1. При добавлении нового модуля *.cpp неизменно получаю сообщение о том что проект не собирается из-за отсутствия правил сборки в make-файле. Видимо среда генерирует правила для сборки только главного файла, созданного при создании проекта. Приходится при добавлении классов, например, запихивать реализацию методов в *.h-файл где описан интерфейс класса. При этом на добавление заголовочных файлов Netbeans не ругается. Но разработку больших проектов приходится вести вот так криво, всё запихивая в ашник…

2. Всё таки охота разобраться с совместным доступом к файлам проекта через NFS. NFS настраиваю и на хосте и на таржете, папки видятся с необходимыми правами доступа, отображение папок хоста и таржета тоже ок. Но вот сборка не удается…

Буду благодарен за помощь :) Всем удачного кодинга :)!
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
по первому пункту подсказать не могу, ибо пишу в mc и соответственно переделываю Makefile руками.
А по второму интересно, что именно делали, и чем заканчивается сборка.
Да пребудет с вами знание ip адреса
domov0y
ибо пишу в mc

Четко :) Я тож не заморачиваюсь особенно на всякие IDE, однако удобно, все проекты связанные с системой в одной среде, и локальное ПО, и бортовое, и веб-интерфейс… А в командировке за неимением компа писал всё на мобильнике Nokia через SSH и Mini Commander :) Ничё, жить можно

domov0y
по второму интересно…

Собсна по сабжу. Что делал:

1. Запустил NFS на обеих машинах, расшарил в каждой из них по папке. Вот так

На хосте

# /etc/exports
#
/home/maisvendoo/netbeans/railway 192.168.0.0/24(rw,fsid=0,no_subtree_check,nohide)

На таржете

# /etc/exports
#
/home/locodriver/railway 192.168.0.0/24(rw,fsid=0,no_subtree_check,async)

2. Netbeans выбрал в настройках “Общий доступ к папкам на уровне системы (NFS)” и в указателе путей связал пути к указанным папкам



При попытке сборки ругается на отсутствие файлов в целевой системе. Тогда

3. Копирую сам проект и все связанные файлы (заголовочные) на целевую машину. Проект собирается, но изменения внесенные в среде в код не отображаются в копии на целевой машине. Если файлы в ручную копировать, то нафиг тогда все эти настройки???

Вот в чем суть проблемы
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Читаем заповедь “будь проще и компьютер тебя поймет” до просветления. После этого берем в руки бубен и начинаем плясать от печки.
1. примонтировать NFS от гостевой системы к хосту.
2. зайти на хосте через терминал в папку проекта на удаленной системе и сказать фас make
3. посмотреть на результат. по идее все должно собраться без ошибок. (правда библиотеки система будет подтаскивать с машины хоста. критично ли это?).
Да пребудет с вами знание ip адреса
domov0y
Читаем заповедь “будь проще и компьютер тебя поймет” до просветления. После этого берем в руки бубен и начинаем плясать от печки.
1. примонтировать NFS от гостевой системы к хосту.
2. зайти на хосте через терминал в папку проекта на удаленной системе и сказать фас make
3. посмотреть на результат. по идее все должно собраться без ошибок. (правда библиотеки система будет подтаскивать с машины хоста. критично ли это?).

Да это то понятно. Можно и папку примонтировать, и там же через mc редактировать исходники и make-файл. Я делал так, и собирается всё. Просто хочется саставить Netbeans работать, раз она продекларирует эту фишку - раз, и для удобства разработки, когда все связанные проекты в одном дереве, это два.

Меня убивает, почему она не изменяет мейк при добавлении модулей *.cpp, ведь должна. И сборка начинается только если при создании проекта создавать автоматом главный файл (вот в этот момент она правила сборки и прописывает видимо)

Просветление просветлением, никогда не чурался простых способов, сам их проповедую, но хочется удобства. Так как проект большой и задача не простая, а руки охота освободить. И голову, для решения научных проблем.

P.S.: Вот так все описанное выглядит в жизни :)


Собственно на Arch перелез с Debian и прочих убунт
a) Дебиан задрал своими древними пакетами
б) в арче чувствуешь себя хозяином в своей системе, где нет никакой лишней хрени
в) мой комп превратился просто в адскую числодробилку :)

Так что касаемо любви к простоте, тут всё ОК :)
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Блин, я серьезно. Пусть монтированием NFS шар занимается система. И вам надо убедиться что оно нормально работает в режиме “все ручками”. А среде разработки надо дать по рукам чтобы не лезла монтировать то что не надо.
Да пребудет с вами знание ip адреса
Прошу прощения, если ответ выглядел ёрничеством…

Проверю, ручками…

Проверил

Содержимое /etc/exports
# /etc/exports
#
# List of directories exported to NFS clients.  See exports(5).
# Use exportfs -arv to reread.
#
# Example for NFSv2 and NFSv3:
#  /srv/home       hostname1(rw,sync) hostname2(ro,sync)
#
# Example for NFSv4:
#  /srv/nfs4       hostname1(rw,sync,fsid=0)
#  /srv/nfs4/home   hostname1(rw,sync,nohide)
# Using Kerberos and integrity checking:
#  /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt)
#  /srv/nfs4/home   gss/krb5i(rw,sync,nohide)
#
/home/locodriver 192.168.0.0/24(rw,no_subtree_check,async)

Примонтировал директорию
sudo mount -t nfs4 192.168.0.104:/home/locodriver /mnt

Примонтировалась. Выполнил
$ cd /mnt/railway/lcu_ep20
$ make clean
$ make

Результат
"make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Вход в каталог `/mnt/railway/lcu_ep20'
"make"  -f nbproject/Makefile-Debug.mk ../modules/lcu_ep20
make[2]: Вход в каталог `/mnt/railway/lcu_ep20'
make[2]: `../modules/lcu_ep20' не требует обновления.
make[2]: Выход из каталога `/mnt/railway/lcu_ep20'
make[1]: Выход из каталога `/mnt/railway/lcu_ep20'
[maisvendoo@arch-host lcu_ep20]$ make clean
"make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
make[1]: Вход в каталог `/mnt/railway/lcu_ep20'
rm -f -r build/Debug
rm -f ../modules/lcu_ep20
make[1]: Выход из каталога `/mnt/railway/lcu_ep20'
[maisvendoo@arch-host lcu_ep20]$ ls modules
ls: невозможно получить доступ к modules: Нет такого файла или каталога
[maisvendoo@arch-host lcu_ep20]$ ls ../modules
[maisvendoo@arch-host lcu_ep20]$ make
"make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Вход в каталог `/mnt/railway/lcu_ep20'
"make"  -f nbproject/Makefile-Debug.mk ../modules/lcu_ep20
make[2]: Вход в каталог `/mnt/railway/lcu_ep20'
mkdir -p build/Debug/GNU-Linux-x86
g++    -c -g -o build/Debug/GNU-Linux-x86/lcu_ep20.o lcu_ep20.cpp
In file included from lcu_ep20.h:20:0,
                 from lcu_ep20.cpp:8:                                                                                                                                                          
tcp_client.h:10:30: предупреждение: лишние токены в конце директивы #include [по умолчанию включена]                                                                                           
In file included from lcu_ep20.h:22:0,                                                                                                                                                         
                 from lcu_ep20.cpp:8:                                                                                                                                                          
speed_reg.h: In constructor «CSpeedReg::CSpeedReg()»:                                                                                                                                          
speed_reg.h:115:71: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]                                                                                    
speed_reg.h:116:54: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]                                                                                    
lcu_ep20.cpp: В функции «int main()»:                                                                                                                                                          
lcu_ep20.cpp:16:68: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]                                                                                    
lcu_ep20.cpp:17:72: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]                                                                                    
lcu_ep20.cpp:18:74: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]                                                                                    
lcu_ep20.cpp:20:27: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]                                                                                    
lcu_ep20.cpp:21:70: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]                                                                                    
lcu_ep20.cpp:22:70: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:23:70: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:24:27: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:32:62: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:58:84: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:62:76: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:64:63: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:69:76: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:72:55: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:75:57: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp: В функции «void* SendThread(void*)»:
lcu_ep20.cpp:122:52: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:133:74: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp: В функции «void* RecvThread(void*)»:
lcu_ep20.cpp:144:50: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
lcu_ep20.cpp:158:72: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
mkdir -p ../modules
g++     -lpthread -o ../modules/lcu_ep20 build/Debug/GNU-Linux-x86/lcu_ep20.o  
make[2]: Выход из каталога `/mnt/railway/lcu_ep20'
make[1]: Выход из каталога `/mnt/railway/lcu_ep20'

Сборка удалась…
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Такс, я осел и олень. И вот почему:

1. Убрал флаг fsid=0 в экспортах, не знаю, но раньше с ним монтировалось…
2. И ГЛАВНОЕ!!! В среде есть на папке с исходниками - выгрузить в [email protected] ….. !!!!!

Блин… Огромное спасибо за помощь, сейчас попробую ещё и модули посоздавать…

P.S.:

При добавлении модулей в проект на таржет нуждается в переносе и папка с настройками проекта, в которой содержаться файлы с правилами для make объектных модулей.
В общем оказалось проще средствами среды вручную создать Makefile, и потом просто выгружать его на таржет вместе с исходниками и заголовками перед сборкой.

domov0y, Ещё раз респект за разъяснения

Когда остынет голова от бурной мыслительной деятельности изложу подробно как настроить разработку с использованием общего доступа по NFS

P.S.S.: Таки руками созданный мейк проще редактировать, без всяких наворотов среды. То есть разработка становится доступной и оттуда где среды нет, например с SSH-терминала мобильника…
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
 
Зарегистрироваться или войдите чтобы оставить сообщение.