Cmake学习笔记(五) cmake 应用训练,基于libuvc分析cmake

编程入门 行业动态 更新时间:2024-10-24 08:26:07

Cmake<a href=https://www.elefans.com/category/jswz/34/1770117.html style=学习笔记(五) cmake 应用训练,基于libuvc分析cmake"/>

Cmake学习笔记(五) cmake 应用训练,基于libuvc分析cmake

针对之前搞得的Cmake的东西,练手很少,还是觉得掌握的不到位,opencv什么的太大了,本身cmake也不会用的太多,就懒得看了,刚好最近项目有用libuvc,也是依赖cmake编译的,而且libuvc小而美,看代码的同事学习一下cmake,做为练习。

简单介绍一句libuvc,跨平台的开源库,托管在git上,用来对标砖uvc设备进行操作,依赖libusb,可以增加对libjpeg的依赖(用来对某些jpeg格式的camera输出进行解码)

libuvc CMakeLists源码

cmake_minimum_required(VERSION 2.8)if (NOT CMAKE_BUILD_TYPE)message(STATUS "No build type selected, default to Release")set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
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()set(libuvc_VERSION_MAJOR 0)
set(libuvc_VERSION_MINOR 0)
set(libuvc_VERSION_PATCH 6)
set(libuvc_VERSION ${libuvc_VERSION_MAJOR}.${libuvc_VERSION_MINOR}.${libuvc_VERSION_PATCH})set(libuvc_DESCRIPTION "A cross-platform library for USB video devices")
set(libuvc_URL "")find_package(PkgConfig)
pkg_check_modules(LIBUSB libusb-1.0)# Try to find JPEG using a module or pkg-config. If that doesn't work, search for the header.
find_package(jpeg QUIET)
if(JPEG_FOUND)set(JPEG_LINK_FLAGS ${JPEG_LIBRARIES})
else()pkg_check_modules(JPEG QUIET libjpeg)if(JPEG_FOUND)set(JPEG_INCLUDE_DIR ${JPEG_INCLUDE_DIRS})set(JPEG_LINK_FLAGS ${JPEG_LDFLAGS})else()find_path(JPEG_INCLUDE_DIR jpeglib.h)if(JPEG_INCLUDE_DIR)set(JPEG_FOUND ON)set(JPEG_LINK_FLAGS -ljpeg)endif()endif()
endif()include(GNUInstallDirs)SET(CMAKE_C_FLAGS_DEBUG "-g -DUVC_DEBUGGING")SET(INSTALL_CMAKE_DIR "${CMAKE_INSTALL_PREFIX}/lib/cmake/libuvc" CACHE PATH"Installation directory for CMake files")SET(SOURCES src/ctrl.c src/ctrl-gen.c src/device.c src/diag.csrc/frame.c src/init.c src/stream.csrc/misc.c)include_directories(${libuvc_SOURCE_DIR}/include${libuvc_BINARY_DIR}/include${LIBUSB_INCLUDE_DIRS}
)if(JPEG_FOUND)message(STATUS "Building libuvc with JPEG support.")include_directories(${JPEG_INCLUDE_DIR})SET(LIBUVC_HAS_JPEG TRUE)SET(SOURCES ${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})list(APPEND UVC_TARGETS uvc)
endif()if(BUILD_UVC_STATIC)add_library(uvc_static STATIC ${SOURCES})set_target_properties(uvc_static PROPERTIES OUTPUT_NAME uvc)list(APPEND UVC_TARGETS uvc_static)
endif()configure_file(include/libuvc/libuvc_config.h.in${PROJECT_BINARY_DIR}/include/libuvc/libuvc_config.h @ONLY)foreach(target_name ${UVC_TARGETS})set_target_properties(${target_name} PROPERTIESPUBLIC_HEADER "include/libuvc/libuvc.h;${libuvc_BINARY_DIR}/include/libuvc/libuvc_config.h" )
endforeach()if(BUILD_UVC_SHARED)if(JPEG_FOUND)target_link_libraries (uvc ${JPEG_LINK_FLAGS})endif(JPEG_FOUND)target_link_libraries(uvc ${LIBUSB_LIBRARIES})#add_executable(test src/test.c)#target_link_libraries(test uvc ${LIBUSB_LIBRARIES} opencv_highgui#  opencv_core)
endif()install(TARGETS ${UVC_TARGETS}EXPORT libuvcTargetsLIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}"ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}"PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_PREFIX}/include/libuvc"
)export(TARGETS ${UVC_TARGETS}FILE "${PROJECT_BINARY_DIR}/libuvcTargets.cmake")
export(PACKAGE libuvc)set(CONF_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include")
set(CONF_LIBRARY_DIR "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
set(CONF_LIBRARY "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}/${CMAKE_SHARED_LIBRARY_PREFIX}uvc${CMAKE_SHARED_LIBRARY_SUFFIX}")configure_file(libuvcConfig.cmake.in ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/libuvcConfig.cmake)configure_file(libuvcConfigVersion.cmake.in ${PROJECT_BINARY_DIR}/libuvcConfigVersion.cmake @ONLY)configure_file(libuvc.pc.in ${PROJECT_BINARY_DIR}/libuvc.pc @ONLY)install(FILES"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/libuvcConfig.cmake""${PROJECT_BINARY_DIR}/libuvcConfigVersion.cmake"DESTINATION "${INSTALL_CMAKE_DIR}")install(EXPORT libuvcTargetsDESTINATION "${INSTALL_CMAKE_DIR}")install(FILES"${PROJECT_BINARY_DIR}/libuvc.pc"DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
)

Step 1

if (NOT CMAKE_BUILD_TYPE)message(STATUS "No build type selected, default to Release")set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
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()

#设置 CMAKE_BUILD_TYPE 和CMAKE_BUILD_TARGET这两个cache变量,后面穿件makefile会用到
#set( … CACHE [FORCE])

set cache force

SET(var1 13)
变量 var1 被设置成 13
如果 var1 在cache中已经存在,该命令不会overwrite cache中的值
SET(var1 13 ... CACHE ...)
如果cache存在该变量,使用cache中变量
如果cache中不存在,将该值写入cache
SET(var1 13 ... CACHE ... FORCE)
不论cache中是否存在,始终使用该值 

Step 2

set(libuvc_VERSION_MAJOR 0)
set(libuvc_VERSION_MINOR 0)
set(libuvc_VERSION_PATCH 6)
set(libuvc_VERSION ${libuvc_VERSION_MAJOR}.${libuvc_VERSION_MINOR}.${libuvc_VERSION_PATCH})set(libuvc_DESCRIPTION "A cross-platform library for USB video devices")
set(libuvc_URL "")

#设置一些版本变量

Step 3

find_package(PkgConfig)
pkg_check_modules(LIBUSB libusb-1.0)
# Try to find JPEG using a module or pkg-config. If that doesn't work, search for the header.
find_package(jpeg QUIET)
if(JPEG_FOUND)set(JPEG_LINK_FLAGS ${JPEG_LIBRARIES})
else()pkg_check_modules(JPEG QUIET libjpeg)if(JPEG_FOUND)set(JPEG_INCLUDE_DIR ${JPEG_INCLUDE_DIRS})set(JPEG_LINK_FLAGS ${JPEG_LDFLAGS})else()find_path(JPEG_INCLUDE_DIR jpeglib.h)if(JPEG_INCLUDE_DIR)set(JPEG_FOUND ON)set(JPEG_LINK_FLAGS -ljpeg)endif()endif()
endif()

寻找libusb和libjpeg的依赖路径和头文件路径

寻找libusb,在PkgConfig里找
寻找libusb 是否直接安装,是否可在PkgConfig里找到,否则查找头文件,用直接链接

find_package整理

step

SET(CMAKE_C_FLAGS_DEBUG "-g -DUVC_DEBUGGING")SET(INSTALL_CMAKE_DIR "${CMAKE_INSTALL_PREFIX}/lib/cmake/libuvc" CACHE PATH"Installation directory for CMake files")SET(SOURCES src/ctrl.c src/ctrl-gen.c src/device.c src/diag.csrc/frame.c src/init.c src/stream.csrc/misc.c)
  • 设置编译选项(DUVC_DEBUGGING 本来以为是宏,可是源码里没找到,暂时没思路,回头再看)
  • 设置安装路径
  • 设置sources变量,即添加编译源文件

step 4

include_directories(${libuvc_SOURCE_DIR}/include${libuvc_BINARY_DIR}/include${LIBUSB_INCLUDE_DIRS}
)if(JPEG_FOUND)message(STATUS "Building libuvc with JPEG support.")include_directories(${JPEG_INCLUDE_DIR})SET(LIBUVC_HAS_JPEG TRUE)SET(SOURCES ${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()

设置常规的编译选项
需要注意的是:libuvc_SOURCE_DIR libuvc_BINARY_DIR是根据PROJECT_BINARY_DIR来的,如果当前的cmakelist 设置了project,那就可以用该名字,这个问题竟然 卡了我两三个小时。。。蛋疼

更多推荐

Cmake学习笔记(五) cmake 应用训练,基于libuvc分析cmake

本文发布于:2024-02-12 16:00:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1688454.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   Cmake   libuvc   cmake

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!