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库等)。

2616

被折叠的 条评论
为什么被折叠?



