Open LysenkoAnastasia opened 2 years ago
# в директорию classic_interface копируем файлы и симлинки libclassic_fr_drv_ng*
cd classic_interface
mkdir build
cd build
cmake ..
make
Всё должно собраться. Исполняемый файл по умолчанию ищет libclassic в своей директории:
set(CMAKE_INSTALL_RPATH "$ORIGIN")
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
поэтому его необходимо положить еще и рядом с classic_interface_example
Похожая ситуация, но ответ выше или я не понимаю или он не помог. Скачиваю Release и закидываю в корень к пользователю и перехожу в нее (linux_1.6.0.582\x86_64).
Создаю папку csharp и выполняю команду генерации обертки для C#
swig -c++ -csharp -namespace ru.shtrih_m.fr_drv_ng.classic_interface -o csharp/classic_interface_wrap.cxx classic_interface.i
Тут вроде все хорошо и ошибок нет
Далее создаю файл CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
add_library(classic_fr_drv_ng_csharp SHARED csharp/classic_interface_wrap.cxx)
set_target_properties(classic_fr_drv_ng_csharp PROPERTIES CXX_VISIBILITY_PRESET default)
target_link_libraries(classic_fr_drv_ng_csharp classic_fr_drv_ng)
и выполняю cmake .
Получаю вывод:
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hacpatb/linux_1.6.0.582/x86_64
Вроде бы тоже все хорошо.
Далее пытаюсь cmake --build .
И тут уже получаю:
[ 50%] Building CXX object CMakeFiles/classic_fr_drv_ng_csharp.dir/csharp/classic_interface_wrap.cxx.o
/home/hacpatb/linux_1.6.0.582/x86_64/csharp/classic_interface_wrap.cxx:317:10: fatal error: classic_interface.h: No such file or directory
#include <classic_interface.h>
^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMakeFiles/classic_fr_drv_ng_csharp.dir/build.make:75: recipe for target 'CMakeFiles/classic_fr_drv_ng_csharp.dir/csharp/classic_interface_wrap.cxx.o' failed
make[2]: *** [CMakeFiles/classic_fr_drv_ng_csharp.dir/csharp/classic_interface_wrap.cxx.o] Error 1
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/classic_fr_drv_ng_csharp.dir/all' failed
make[1]: *** [CMakeFiles/classic_fr_drv_ng_csharp.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make: *** [all] Error 2
Куда я только не складывал этот файл, ошибка оставалась. Это я порешал чутка изменив classic_interface_wrap.cxx и дописал полный путь до classic_interface.h.
#include </home/hacpatb/linux_1.6.0.582/x86_64/classic_interface.h>
Далее поехали, cmake --build .
[ 50%] Building CXX object CMakeFiles/classic_fr_drv_ng_csharp.dir/csharp/classic_interface_wrap.cxx.o
[100%] Linking CXX shared library libclassic_fr_drv_ng_csharp.so
/usr/bin/ld: cannot find -lclassic_fr_drv_ng
collect2: error: ld returned 1 exit status
CMakeFiles/classic_fr_drv_ng_csharp.dir/build.make:96: recipe for target 'libclassic_fr_drv_ng_csharp.so' failed
make[2]: *** [libclassic_fr_drv_ng_csharp.so] Error 1
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/classic_fr_drv_ng_csharp.dir/all' failed
make[1]: *** [CMakeFiles/classic_fr_drv_ng_csharp.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make: *** [all] Error 2
Хорошо, и тут я нашел файл link.txt, который находится в /CMakeFiles/classic_fr_drv_ng_csharp.dir и изменил его
с /usr/bin/c++ -fPIC -shared -Wl,-soname,libclassic_fr_drv_ng_csharp.so -o libclassic_fr_drv_ng_csharp.so CMakeFiles/classic_fr_drv_ng_csharp.dir/csharp/classic_interface_wrap.cxx.o -lclassic_fr_drv_ng
на /usr/bin/c++ -fPIC -shared -Wl,-soname,libclassic_fr_drv_ng_csharp.so -o libclassic_fr_drv_ng_csharp.so CMakeFiles/classic_fr_drv_ng_csharp.dir/csharp/classic_interface_wrap.cxx.o -L/home/hacpatb/linux_1.6.0.582/x86_64 -lclassic_fr_drv_ng
И наконец последний cmake --build .
Consolidate compiler generated dependencies of target classic_fr_drv_ng_csharp
[ 50%] Linking CXX shared library libclassic_fr_drv_ng_csharp.so
/usr/bin/ld:/home/hacpatb/linux_1.6.0.582/x86_64/libclassic_fr_drv_ng.so: file format not recognized; treating as linker script
/usr/bin/ld:/home/hacpatb/linux_1.6.0.582/x86_64/libclassic_fr_drv_ng.so:0: syntax error
collect2: error: ld returned 1 exit status
CMakeFiles/classic_fr_drv_ng_csharp.dir/build.make:96: recipe for target 'libclassic_fr_drv_ng_csharp.so' failed
make[2]: *** [libclassic_fr_drv_ng_csharp.so] Error 1
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/classic_fr_drv_ng_csharp.dir/all' failed
make[1]: *** [CMakeFiles/classic_fr_drv_ng_csharp.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make: *** [all] Error 2
Дальше я все. Не понимаю что ему не нравится. Куда нужно было складывать файлы, мб что-то писать в CMakeLists.txt. Подскажите пожалуйста где я свернул не туда? )
обновлен README.md. поправлена строка вызова swig и пример cmake для библиотеки
"На правах рекламы" посмотрите в сторону json-rpc, не нужно будет проходить через вот это вот всё.
обновлен README.md. поправлена строка вызова swig и пример cmake для библиотеки
Спасибо. Все собралось без проблем, но только на "настоящей" линухе. На wsl получил ту же самое ошибку что и в конце моего вопроса. Кто захочет на wsl все это проделать - не стоит )
"На правах рекламы" посмотрите в сторону json-rpc, не нужно будет проходить через вот это вот всё.
Сразу же тогда уточню - тип подключения ФР не важен? Можно так же serial://./COM8 или ttyUSB0 указать в ConnectionURI и будет коннект?
обновлен README.md. поправлена строка вызова swig и пример cmake для библиотеки
Спасибо. Все собралось без проблем, но только на "настоящей" линухе. На wsl получил ту же самое ошибку что и в конце моего вопроса. Кто захочет на wsl все это проделать - не стоит )
wsl тут мешать не может, ищите что сделали не так на wsl
"На правах рекламы" посмотрите в сторону json-rpc, не нужно будет проходить через вот это вот всё.
Сразу же тогда уточню - тип подключения ФР не важен? Можно так же serial://./COM8 или ttyUSB0 указать в ConnectionURI и будет коннект?
да, это тот же интерфейс со всеми теми же правилами просто RPC, ну и сервер придется держать запускать следить что он жив итд.
Как установить драйвер на Ubuntu? Скачала https://github.com/shtrih-m/fr_drv_ng/releases/download/1.5.0-43-g45e25ee/fr_drv_ng_linux_aarch64_le_1.5.0-43-g45e25ee.zip. Как происходит сборка? После команды cmake --build .получаю ошибки
aarch64_le/./libclassic_fr_drv_ng.so when searching for -lclassic_fr_drv_ng /usr/bin/ld: cannot find -lclassic_fr_drv_ng collect2: error: ld returned 1 exit status CMakeFiles/classic_interface_example.dir/build.make:94: recipe for target 'classic_interface_example' failed make[2]: [classic_interface_example] Error 1 CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/classic_interface_example.dir/all' failed make[1]: [CMakeFiles/classic_interface_example.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2