掌握CMake ExternalProject:手把手实现libuvc跨平台自动构建

ExternalProject的特点是在构建阶段(Build)执行外部项目(如下载、配置、编译、安装),而不是在配置阶段(Configure)。这决定了它与主项目的CMake配置流程是分离的。
例如,假设你的项目目录如下:

your_project/
├── CMakeLists.txt              # 项目主CMake文件
├── external/
│   └── libuvc.cmake            # 专门定义libuvc外部项目的CMake文件
├── src/
│   ├── main.cpp                # 你的C++主程序
│   └── CMakeLists.txt          # 你的应用程序CMake文件
└── build/                      # 构建目录(建议)

首先,你的项目主配置文件

cmake_minimum_required(VERSION 3.15)
project(YourProjectWithLibuvc LANGUAGES C CXX)

set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Installation prefix")

#1. 设置libuvc及其依赖的安装路径
set(LIBUVC_INSTALL_DIR ${CMAKE_BINARY_DIR}/install) 
set(LIBUSB_INSTALL_DIR ${LIBUVC_INSTALL_DIR})       # 假设libusb也安装到同一目录

#2. 包含自定义的模块(我们将在下一步创建)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external)
include(libuvc.cmake)

#3. 添加你自己的项目,它会依赖已构建的libuvc
add_subdirectory(src)

然后,外部依赖项目external/libuvc.cmake

include(ExternalProject)

# 定义libuvc为外部项目
ExternalProject_Add(
    libuvc_external
    
    # 源代码获取方式:从GitHub克隆
    GIT_REPOSITORY    https://github.com/libuvc/libuvc.git
    GIT_TAG           master  # 或指定一个稳定版本标签,如 `v0.0.6`
    GIT_SHALLOW       TRUE
    
    # 构建和安装目录
    SOURCE_DIR        ${CMAKE_BINARY_DIR}/libuvc-src
    BINARY_DIR        ${CMAKE_BINARY_DIR}/libuvc-build
    INSTALL_DIR       ${LIBUVC_INSTALL_DIR}
    
    # CMake配置步骤
    CMAKE_ARGS
        -DCMAKE_INSTALL_PREFIX=${LIBUVC_INSTALL_DIR}
        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
        -DBUILD_EXAMPLE=OFF  # 通常我们不需要编译示例
        # 关键:告诉libuvc去哪里找它的依赖libusb
        -DLIBUSB_INCLUDE_DIR=${LIBUSB_INSTALL_DIR}/include
        -DLIBUSB_LIBRARIES=${LIBUSB_LIBRARY_PATH} # 需要根据libusb的安装情况调整
        
    # 构建命令
    BUILD_COMMAND     ${CMAKE_COMMAND} --build <BINARY_DIR> --config ${CMAKE_BUILD_TYPE}
    
    # 更新设置,确保外部项目被构建在主项目之前
    UPDATE_COMMAND    ""
    
    # 日志记录(调试用)
    LOG_DOWNLOAD      ON
    LOG_CONFIGURE     ON
    LOG_BUILD         ON
    LOG_INSTALL       ON
)

#为你的主项目创建一些变量,方便在src/CMakeLists.txt中引用
set(LIBUVC_INCLUDE_DIR ${LIBUVC_INSTALL_DIR}/include)

if(WIN32)
    set(LIBUVC_LIBRARY ${LIBUVC_INSTALL_DIR}/lib/libuvc.lib) # Windows静态库
else()
    set(LIBUVC_LIBRARY ${LIBUVC_INSTALL_DIR}/lib/libuvc.a)   # Linux静态库
endif()

最后,如果src中的CMakeLists.txt中也需要使用这个库:

#你的目标程序
add_executable(my_uvc_app main.cpp)

#指定头文件包含目录
target_include_directories(my_uvc_app PRIVATE ${LIBUVC_INCLUDE_DIR})

#指定链接库
target_link_libraries(my_uvc_app PRIVATE ${LIBUVC_LIBRARY})

#在Windows上,libuvc还依赖libusb和pthreads,需要一并链接
if(WIN32)
    target_link_libraries(my_uvc_app PRIVATE ${LIBUSB_INSTALL_DIR}/lib/libusb-1.0.lib)
    target_link_libraries(my_uvc_app PRIVATE ws2_32) # WinSock
    # 注意:pthreads在Windows上通常是pthreadVC2.lib,需要你自行获取并指定路径
else()
    target_link_libraries(my_uvc_app PRIVATE usb-1.0 pthread)
endif()

#关键:声明对libuvc_external的依赖,确保它在主项目之前构建
add_dependencies(my_uvc_app libuvc_external)

注意:
Windows系统特殊处理

  • 源码修改:直接使用MSVC编译原始的libuvc源码在Windows上会报错,你可以参照这篇博文进行修改(例如,替换sys/time.h,修改strdup为_strdup,配置pthreads库等)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steptoward

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值