Compilation des librairies LibUSB et LibUVC avec Msys2
Après avoir mis en place une machine virtuelle d’un environnement Windows 20H2 (voir page précédente), nous allons testé de compiler les librairies LibUSB et LibUVC afin de récupérer un flux vidéo de notre caméra thermique FLIR Lepton 3.5. Pour cela, nous allons utilisé la plateforme-forme de distribution et de développement de logiciels Msys2.
Nous partons donc du snapshot « 2 – Update OK Desactivé ».
Installation de Msys2
Pour installer Msys2, nous allons sur le site officiel de la plateforme « https://www.msys2.org/ ». Nous téléchargeons donc l’installeur de msys2 dans un répertoire « Sources » du Disque Local (C:).
Msys2 x86-64
1 file 96.104 MB 15/02/2021
Nous installons MSYS2 64bit dans un répertoire « C:\msys64 », c’est donc une installation par défaut.
Nous choisissons à cet endroit de faire un snapshot « 3.5 – Base Msys 2 ».
Ensuite, nous allons ajouter des composants dans l’environnement Msys2. Cela va nous permettre de compiler la LibUSB. Nous exécutons le terminal MSYS2 MinGW 64-bit via le menu démarrer. La liste des packages installables se trouve sur le site « https://packages.msys2.org/package/ ».
Terminal
1 2 3 4 5 |
pacman -S autoconf pacman -S automake pacman -S libtool pacman -S mingw-w64-x86_64-gcc pacman -S make |
Compilation de la LibUSB avec Msys2
Pour compiler la LibUSB, nous allons devoir télécharger le dossier LibUSB que nous récupérons sur le GitHub officiel des librairies LibUSB « https://github.com/libusb/libusb ».
LibUSB
52 files 521 KB 13/02/2021
Nous décompressons cette archive dans un répertoire « C:\work ». Nous renommons le dossier libusb-master en libusb et nous simplifions le chemin en supprimant le double dossier « libusb » créé lors de la décompression.
Nous ouvrons maintenant le terminal MSYS2 MinGW 64-bit et nous exécutons les commandes suivantes pour compiler les librairies.
Terminal
1 2 3 4 |
cd /c/work/libusb ./autogen.sh make make install |
La compilation se déroule avec succès grâce aux composants installés dans la première étape. Nous pouvons maintenant vérifier cela en exécutant le programme dans le dossier examples « listdevs.exe ». Nous ouvrons pour cela l’invité de commandes de Windows (CMD) :
Terminal
1 2 |
cd \work\libusb\examples listdevs.exe |
Dans un premier temps, notre caméra FLIR Lepton 3.5 n’était pas branchée. Ensuite, nous la branchons et notre caméra apparait bien dans la liste des dispositifs USB, c’est le device 6 du bus 3. Nous faisons donc ici un snapshot « 4.1 – Compilation LibUSB OK »
Nous pouvons maintenant commencer la compilation de la LibUVC, qui nécessitera le fichier « libubs-1.0.dll » obtenu lors de la compilation de la LibUSB.
Installation de Cmake-GUI sur Msys2
De plus, nous allons devoir utiliser l’interface graphique du compilateur Cmake pour pouvoir compiler cette seconde librairie. Nous devons donc l’installer sur l’environnement Msys2, via le terminal MSYS2 MinGW 64-bit.
Terminal
1 2 3 4 |
pacman -S mingw-w64-x86_64-cmake pacman -S mingw-w64-x86_64-qt5 cmake-gui # execution de l'interface Cmake sur l'environnement Msys2 |
Compilation de la LibUVC avec Msys2
Pour compiler la LibUVC, nous allons devoir télécharger le dossier LibUVC que nous récupérons sur le GitHub officiel des librairies LibUVC « https://github.com/libuvc/libuvc ».
LibUVC
12 files 120 KB 25/02/2021
Nous décompressons cette archive dans le répertoire « C:\work ». Nous renommons le dossier libuvc-master en libuvc1 et nous simplifions le chemin en supprimant le double dossier « libuvc » créé lors de la décompression.
Nous ouvrons maintenant le terminal MSYS2 MinGW 64-bit et nous exécutons les commandes suivantes pour compiler les librairies.
Terminal
1 2 3 4 |
cd /c/work/libuvc1 mkdir build cd build cmake .. |
La compilation de la librairie ne peut pas s’exécuter de cette manière. En effet, il manque un fichier « cl.exe » qui impliquerait l’installation de l’environnement Microsoft Visual Studio. C’est donc ici que nous allons avoir besoin de l’interface graphique de Cmake.
Nous exécutons Cmake-gui grâce à la commande suivante, toujours sur le terminal Msys2 :
Terminal
1 |
cmake-gui |
Nous allons configurer Cmake en renseignant les informations suivantes :
- Source : C:/work/libuvc1
- Build : C:/work/libuvc1/build
- Generator : MSYS Makefiles, use default native compilers
En cliquant sur Configure puis Generate, nous nous apercevons qu’il manque un lien : Target « uvc » links to target « LibUSB::LibUSB » but the target was not found.
Nous allons donc devoir modifier le fichier CmakeLists.txt du réperoitre libuvc1 pour l’adapter. Nous avons fait 4 changements sur ce fichier :
- lien vers la librairie LibUSB (find_library(LIBUSB_LIBRARY_NAMES)) et find_path(LIBUSB_INCLUDE_DIR))
- Ajout de la librairie dans « target_include_directories »
- Ajout du lien avec target_link_libraries
- Mise en commentaire de l’ancien target_link_libraries de LibUSB
Texte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
cmake_minimum_required(VERSION 3.1) project(libuvc VERSION 0.0.6 LANGUAGES C ) # Additional search scripts path for libusb-1.0, libjpeg, OpenCV list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) # Xcode and Visual Studio do not using CMAKE_BUILD_TYPE cache variable # so we use Release build type only with single configuration generators. if (NOT CMAKE_CONFIGURATION_TYPES) if(NOT CMAKE_BUILD_TYPE) message(STATUS "No build type selected, default to Release") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE) endif() endif() if(NOT CMAKE_BUILD_TARGET) message(STATUS "No target type selected, default to both shared and static library") set(CMAKE_BUILD_TARGET "Both" CACHE STRING "" FORCE) endif() option(BUILD_EXAMPLE "Build example program" ON) option(BUILD_TEST "Build test program" OFF) option(ENABLE_UVC_DEBUGGING "Enable UVC debugging" OFF) set(libuvc_DESCRIPTION "A cross-platform library for USB video devices") set(libuvc_URL "https://github.com/libuvc/libuvc") set(SOURCES src/ctrl.c src/ctrl-gen.c src/device.c src/diag.c src/frame.c src/init.c src/stream.c src/misc.c ) find_library(LIBUSB_LIBRARY_NAMES usb-1.0 PATHS /opt/local/lib) find_path(LIBUSB_INCLUDE_DIR libusb-1.0/libusb.h PATHS /opt/local/include) find_package(LibUSB) # JpegPkg name to differ from shipped with CMake find_package(JpegPkg QUIET) if(JPEG_FOUND) message(STATUS "Building libuvc with JPEG support.") set(LIBUVC_HAS_JPEG TRUE) list(APPEND SOURCES src/frame-mjpeg.c) else() message(WARNING "JPEG not found. libuvc will not support JPEG decoding.") endif() if(${CMAKE_BUILD_TARGET} MATCHES "Shared") set(BUILD_UVC_SHARED TRUE) elseif(${CMAKE_BUILD_TARGET} MATCHES "Static") set(BUILD_UVC_STATIC TRUE) elseif(${CMAKE_BUILD_TARGET} MATCHES "Both") set(BUILD_UVC_SHARED TRUE) set(BUILD_UVC_STATIC TRUE) else() message(FATAL_ERROR "Invalid build type ${CMAKE_BUILD_TARGET}" ) endif() if(BUILD_UVC_SHARED) add_library(uvc SHARED ${SOURCES}) set_target_properties(uvc PROPERTIES VERSION ${libuvc_VERSION} SOVERSION ${libuvc_VERSION_MAJOR} # Exported name of target within namespace LibUVC EXPORT_NAME UVCShared ) list(APPEND UVC_TARGETS uvc) if(NOT LibUVC_STATIC) add_library(LibUVC::UVC ALIAS uvc) endif() # Aliases defined here available only if project included # via addsubdirectory add_library(LibUVC::UVCShared ALIAS uvc) endif() if(BUILD_UVC_STATIC) add_library(uvc_static STATIC ${SOURCES}) set_target_properties(uvc_static PROPERTIES OUTPUT_NAME uvc # Exported name of target within namespace LibUVC EXPORT_NAME UVCStatic ) list(APPEND UVC_TARGETS uvc_static) add_library(LibUVC::UVCStatic ALIAS uvc_static) if(LibUVC_STATIC) add_library(LibUVC::UVC ALIAS uvc_static) endif() endif() configure_file(include/libuvc/libuvc_config.h.in include/libuvc/libuvc_config.h @ONLY ) foreach(target_name IN LISTS UVC_TARGETS) target_include_directories(${target_name} PUBLIC # Different paths for includes for build and install phase supported # via INSTALL_INTERFACE and BUILD_INTERFACE generator expressions. $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include> $<INSTALL_INTERFACE:include> ${LIBUSB_INCLUDE_DIR} ) target_link_libraries(uvc ${LIBUSB_LIBRARY_NAMES}) # target_link_libraries(${target_name} # libusb-1.0 used internally so we link to it privately. # PRIVATE LibUSB::LibUSB #) if(JPEG_FOUND) target_link_libraries(${target_name} PRIVATE JPEG::JPEG ) endif() set_target_properties(${target_name} PROPERTIES PUBLIC_HEADER "include/libuvc/libuvc.h;${CMAKE_CURRENT_BINARY_DIR}/include/libuvc/libuvc_config.h" ) if(ENABLE_UVC_DEBUGGING) target_compile_definitions(${target_name} PRIVATE UVC_DEBUGGING ) endif() endforeach() if(BUILD_EXAMPLE) add_executable(example src/example.c) find_package(Threads) target_link_libraries(example PRIVATE LibUVC::UVC Threads::Threads ) endif() if(BUILD_TEST) # OpenCV defines targets with transitive dependencies not with namespaces but using opencv_ prefix. # This targets provide necessary include directories and linked flags. find_package(OpenCVPkg REQUIRED COMPONENTS opencv_core opencv_highgui ) add_executable(uvc_test src/test.c) target_link_libraries(uvc_test PRIVATE LibUVC::UVC opencv_core opencv_highgui ) endif() include(GNUInstallDirs) set(CMAKE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/libuvc) install( TARGETS ${UVC_TARGETS} EXPORT libuvcTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libuvc ) install(EXPORT libuvcTargets FILE libuvcTargets.cmake NAMESPACE LibUVC:: DESTINATION ${CMAKE_INSTALL_CMAKEDIR} ) install(FILES cmake/FindLibUSB.cmake cmake/FindJpegPkg.cmake DESTINATION ${CMAKE_INSTALL_CMAKEDIR} ) include(CMakePackageConfigHelpers) write_basic_package_version_file(libuvcConfigVersion.cmake COMPATIBILITY AnyNewerVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libuvcConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_CMAKEDIR} ) if(JPEG_FOUND) # If we have used JPEG library we need to # add linker flag for it in config file for pkgconfig set(PKGCONFIG_JPEG_LDFLAG "-ljpeg") endif() configure_file(libuvc.pc.in ${PROJECT_BINARY_DIR}/libuvc.pc @ONLY ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libuvc.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) install(FILES libuvcConfig.cmake DESTINATION ${CMAKE_INSTALL_CMAKEDIR} ) |
Nous pouvons maintenant réouvrir Cmake, nous sélectionnons l’option « Delete Cache » dans « File » pour repartir de zéro. Il faut renseigner les liens surlignés en jaune pour avoir la même configuration que nous :
Ensuite, il faut cliquer sur Configure puis Generate. Nous ouvrons le terminal MSYS2 pour utiliser le makefile qui vient d’être créé :
Terminal
1 2 |
cd /c/work/libuvc1/build make |
La LibUVC est maintenant compilée. Nous allons devoir ajouter des fichiers .dll dans le répertoire « C:\work\libuvc1\build » pour exécuter l’example :
- libusb-1.0.dll
- libwinpthread-1.dll
Ces fichiers se trouvent dans le répertoire « C:\msys64\mingw64\bin » et nous les copions dans le build.
Nous ouvrons maintenant l’invité de commandes (CMD) de Windows pour exécuter l’exemple.
Terminal
1 2 |
cd \work\libuvc1\build example.exe |
La première exécution du programme s’est faite sans caméra branchée. En branchant la caméra, nous voyons que le dispositif est trouvé (comme avec la librairie LibUSB). Cependant, il n’est pas supporté par la librairie LibUVC.
Nous faisons à cet endroit un snapshot « 6.1 – Compilation LibUVC avec Example OK ».