LINUX.ORG.RU

libmodbus кросс-компиляция raspberry pi 4.

 


0

1

Встроенная библиотека qtmodbas очень много отнимает ресурсов. Решил использовать libmodbus, но как добавить ее к проекту? Подумал решит в лоб, добавил .h и .c файлы в проект. в .pro

SOURCES += \
    main.cpp \
    mainwindow.cpp \
    modbus-data.c \
    modbus-rtu.c \
    modbus-tcp.c \
    modbus.c

HEADERS += \
    mainwindow.h \
    modbus-rtu-private.h \
    modbus-rtu.h \
    modbus-tcp-private.h \
    modbus-tcp.h \
    modbus.h

Собираю проект и получаю ошибку:

'config.h' file not found

Использую компилятор:

gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf

Честно не понятно как правильно подключать внешнее библиотеки типа libmodbus. Поэтому решил просто добавить все файлы в проект и собрать.

Перемещено hobbit из general

Перейди на cmake/meson, иначе будешь страдать.

UVV ★★★★★
()
  • собрать её отдельно
  • при конфигурировании qt-project указать путь к либе через QMAKE_LIBDIR и заголовкам через QMAKE_INCDIR
imb ★★
()
Ответ на: комментарий от imb

На конфигурацию получаю ошибку:

Что сделал:
git clone git://github.com/stephane/libmodbus
cd libmodbus
./autogen.sh
alexey@debian:~/raspberrypi/libmodbus$ ./configure --prefix= ~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf --host=arm-linux-gnueabihf
configure: WARNING: you should use --build, --host, --target
configure: WARNING: invalid host type: /home/alexey/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-linux-gnueabihf-strip... no
checking for strip... strip
configure: WARNING: using cross tools not prefixed with host triplet
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking how to create a pax tar archive... gnutar
checking for arm-linux-gnueabihf-gcc... no
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... yes
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking minix/config.h usability... no
checking minix/config.h presence... no
checking for minix/config.h... no
checking whether it is safe to define __EXTENSIONS__... yes
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... no
checking whether make supports nested variables... (cached) yes
checking build system type... Invalid configuration `/home/alexey/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf': machine `/home/alexey/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm' not recognized
configure: error: /bin/bash build-aux/config.sub /home/alexey/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf failed
Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

так Вы вообще не умеете собирать или у Вас проблема с линковкой с Qt-based project ?

базовое конфигурирование для cross-compile, остальные доступные оции смотрите в ./configure --help и почитайте на эту тему

CC=/path/to/crosscompile/gcc \
./configure --host=arm-linux-gnueabihf
imb ★★
()
Ответ на: комментарий от imb

Сделал вот так вроде собралось:

alexey@debian:~/raspberrypi/libmodbus$ ./autogen.sh
alexey@debian:~/raspberrypi/libmodbus$ ./configure --prefix=/home/alexey/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf --host=arm-linux-gnueabihf
alexey@debian:~/raspberrypi/libmodbus$ make
alexey@debian:~/raspberrypi/libmodbus$ make install

Но qt ругается /../../../../arm-linux-gnueabihf/lib/libmodbus.so: file not recognized: File format not recognized .pro добавил LIBS += -lmodbus

Alex_Golubev
() автор топика
Последнее исправление: Alex_Golubev (всего исправлений: 1)
Ответ на: комментарий от Alex_Golubev
file /path/to/libmodbus.so

покажет под какую архитектуру собрана либа

как пример

$ file staging/usr/lib/libcrypto.so.1.1 
staging/usr/lib/libcrypto.so.1.1: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, with debug_info, not stripped
imb ★★
()
Последнее исправление: imb (всего исправлений: 1)
Ответ на: комментарий от imb

Вот:

alexey@debian:~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib$ ls
debug                libgfortran.so        libssp.a
ldscripts            libgfortran.so.4      libssp_nonshared.a
libasan.a            libgfortran.so.4.0.0  libssp.so
libasan_preinit.o    libgfortran.spec      libssp.so.0
libasan.so           libgomp.a             libssp.so.0.0.0
libasan.so.4         libgomp.so            libstdc++.a
libasan.so.4.0.0     libgomp.so.1          libstdc++fs.a
libatomic.a          libgomp.so.1.0.0      libstdc++.so
libatomic.so         libgomp.spec          libstdc++.so.6
libatomic.so.1       libitm.a              libstdc++.so.6.0.24
libatomic.so.1.2.0   libitm.so             libstdc++.so.6.0.24-gdb.py
libcilkrts.a         libitm.so.1           libsupc++.a
libcilkrts.so        libitm.so.1.0.0       libubsan.a
libcilkrts.so.5      libitm.spec           libubsan.so
libcilkrts.so.5.0.0  libmodbus.la          libubsan.so.0
libcilkrts.spec      libmodbus.so          libubsan.so.0.0.0
libgcc_s.so          libmodbus.so.5        pkgconfig
libgcc_s.so.1        libmodbus.so.5.1.0
libgfortran.a        libsanitizer.spec
alexey@debian:~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib$ file libmodbus.so
libmodbus.so: symbolic link to libmodbus.so.5.1.0
alexey@debian:~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib$ file libmodbus.so.5
libmodbus.so.5: symbolic link to libmodbus.so.5.1.0
alexey@debian:~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib$ file libmodbus.so.5.1.0
libmodbus.so.5.1.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=1cdfc48a451393d7f992bfc02d56ed30e022c95f, not stripped
Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

alexey@debian:~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib$ file libmodbus.so.5.1.0 libmodbus.so.5.1.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=1cdfc48a451393d7f992bfc02d56ed30e022c95f, not stripped

обратите внимание, библиотека собрана под x86-64, а речь вроде как о raspberry pi

проще говоря Вы собрали библиотеку не под ту архитектуру

imb ★★
()
Ответ на: комментарий от imb

Это понял. Но как пересобрать для другой архитектуры? Попробовал:

./configure CROSS_COMPILE=/home/alexey/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- --prefix=/home/alexey/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf --host=arm-linux-gnueabihf

Но архитектура x86-64

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Но как пересобрать для другой архитектуры?

А зачем пересобирать libmodbus для RPi, если она есть готовая в репозитории?
Выполни apt-get install libmodbus-dev на малинке, потом копируй содержимое пакета на свой комп, где кроскомпилишь.

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)
Ответ на: комментарий от sigurd

Это нужно еще раз все пересобрать или можно только выполнить поверх.

rsync -avz pi@192.168.0.101:/lib sysroot
rsync -avz pi@192.168.0.101:/usr/include sysroot/usr
rsync -avz pi@192.168.0.101:/usr/lib sysroot/usr
rsync -avz pi@192.168.0.101:/opt/vc sysroot/opt
./configure -release -opengl es2  -eglfs -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspberrypi/sysroot -prefix /usr/local/qt -extprefix ~/raspberrypi/qt -hostprefix ~/raspberrypi/host-qt -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -make libs -pkg-config -no-use-gold-linker -v -recheck

make

rsync -avz qt pi@192.168.0.101:/usr/local
Alex_Golubev
() автор топика
Последнее исправление: Alex_Golubev (всего исправлений: 2)

отвлечённо : а что вообще подвигнуло к Qt на RPi? миксить modbus и непосредственно Gui, в Linux, в X ?? это bug by design.

MKuznetsov ★★★★★
()
Ответ на: комментарий от Alex_Golubev

зачем играть в телепатов? у вас есть вывод configure, созданные им логи и вывод в процессе сборке, если используется «тихая» сборка" то можно активировать вывод make V=1

вы можете сами проанализовать указанные источники или показать их

imb ★★
()
Ответ на: комментарий от Alex_Golubev

я не уверен что configure знает CROSS_COMPILE, Вы смотрели его справку выводимую по ключу --help ?

imb ★★
()

Честно не понятно как правильно подключать внешнее библиотеки типа libmodbus. Поэтому решил просто добавить все файлы в проект и собрать.

Пример - arm.pro

TARGET = arm

HEADERS += arm.h \ 
...

SOURCES += main.cpp \
           arm.cpp \
...

LIBS += \
xmlrpc/libXmlRpc.a \
ini/libiniparser.a \
...

INCLUDEPATH += \
./xmlrpc/src \
./ini \
...

QMAKE_LIBDIR = /usr/lib/mysql \
./xmlrpc

т.е. библиотеки добавляют в секцию LIBS pro-файла, а их включаемые файлы - в INCLUDEPATH. Пути для поиска либ указывают в QMAKE_LIBDIR

А вообще, что вы пытаетесь скомпилить? Qt есть готовая, зачем ее перекомпилировать?

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от MKuznetsov

отвлечённо : а что вообще подвигнуло к Qt на RPi? миксить modbus и непосредственно Gui, в Linux, в X ?? это bug by design.

Какие ваши предложения для написания Гуи, отображающего состояние объекта, полученное опросом по modbus ?

sigurd ★★★★★
()
Ответ на: комментарий от sigurd

Какие ваши предложения для написания Гуи, отображающего состояние объекта, полученное опросом по modbus ?

состояние объекта полученное опросом через modbus кладётся в промежуточный слой/базу (а-ля редис). Без завязок с X, просто демоном. А Gui (и прочии клиенты) пишется любой.

Если wayland, plasma и модные свистоперделки свалят сессию или доведут её до неюзабельности, состояние modbus не будет потеряно. Отвалится только локальный клиент.

несмотря на то что в наличии «слой промежуточный», в совокупности работать будет быстрее и надёжнее чем новодел на Qt. Потому-что он отлажен и выверен. И задача разбивается на хорошо формализуемые части.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

С этим согласен. Класическая трехзвенная архитектура клиент–контроллер–сервер БД

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.