在deepseek的帮助下进行了Ubuntu240403上VideoPipe环境的搭建,记录如下:

VideoPipe环境基础要求:
● C++ 17
● OpenCV >= 4.6
● GStreamer 1.14.5 (Required by OpenCV)
● GCC >= 7.5

本篇文章的所有脚本在如下资源可自由下载VideoPipe环境搭建及编译ubuntu240403
https://download.csdn.net/download/yhb1206/92617457

1 查看环境

折腾一番才发现,Ubuntu240403默认都装好了,可以执行如下sh脚本看下依赖是否都具备了,可以vim s1-test.sh脚本,复制如下内容:

#!/bin/bash
set -e

cat > test_opencv_gst.cpp << 'EOF'
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/videoio/registry.hpp>
#include <iostream>

int main() {
    std::cout << "OpenCV version: " << CV_VERSION << std::endl;
    
    // OpenCV 4.6.0 检查 GStreamer 支持的正确方式
    #if CV_VERSION_MAJOR >= 4 && CV_VERSION_MINOR >= 6
    // 方法1: 使用新的 videoio_registry
    std::cout << "Checking GStreamer support (new method)..." << std::endl;
    #endif
    
    // 方法2: 直接尝试打开 GStreamer 管道
    std::cout << "\nTesting GStreamer pipeline directly..." << std::endl;
    std::string pipeline = "videotestsrc num-buffers=1 ! videoconvert ! appsink";
    
    // 尝试不同的后端
    cv::VideoCapture cap;
    
    // 先尝试自动检测
    cap.open(pipeline, cv::CAP_ANY);
    if (cap.isOpened()) {
        std::cout << "✓ VideoCapture opened successfully (auto-detected backend)" << std::endl;
        cap.release();
    } else {
        std::cout << "✗ Auto-detection failed" << std::endl;
    }
    
    // 尝试指定 GStreamer
    cap.open(pipeline, cv::CAP_GSTREAMER);
    if (cap.isOpened()) {
        std::cout << "✓ GStreamer backend: WORKING" << std::endl;
        cap.release();
    } else {
        std::cout << "✗ GStreamer backend: NOT WORKING" << std::endl;
    }
    
    // 修正 FFmpeg 测试:FFmpeg 主要用于文件,不是实时管道
    std::cout << "\nTesting FFmpeg backend (corrected method)..." << std::endl;
    
    // 方法1: 检查 FFmpeg 后端是否可用
    bool ffmpeg_supported = cv::videoio_registry::hasBackend(cv::CAP_FFMPEG);
    std::cout << "FFmpeg backend available: " << (ffmpeg_supported ? "YES" : "NO") << std::endl;
    
    // 方法2: 测试 FFmpeg 文件读写能力(FFmpeg 的主要用途)
    std::cout << "Testing FFmpeg file I/O capability..." << std::endl;
    
    // 创建测试图像
    cv::Mat test_frame(100, 100, CV_8UC3, cv::Scalar(0, 255, 0));
    std::string test_file = "ffmpeg_test.jpg";
    
    // 测试图像保存(使用 FFmpeg 如果可用)
    if (cv::imwrite(test_file, test_frame)) {
        std::cout << "✓ Image write successful" << std::endl;
        
        // 测试图像读取
        cv::Mat read_frame = cv::imread(test_file);
        if (!read_frame.empty()) {
            std::cout << "✓ Image read successful: " << read_frame.cols << "x" << read_frame.rows << std::endl;
            std::cout << "✓ FFmpeg backend: WORKING (file I/O)" << std::endl;
        } else {
            std::cout << "✗ Image read failed" << std::endl;
            std::cout << "✗ FFmpeg backend: LIMITED (read failed)" << std::endl;
        }
        
        // 清理测试文件
        remove(test_file.c_str());
    } else {
        std::cout << "✗ Image write failed" << std::endl;
        std::cout << "✗ FFmpeg backend: NOT WORKING" << std::endl;
    }
    
    // 方法3: 测试视频文件支持(FFmpeg 的核心功能)
    std::cout << "\nTesting video file support..." << std::endl;
    cv::VideoWriter writer;
    bool can_write = writer.open("test_video.avi", 
                                cv::VideoWriter::fourcc('M','J','P','G'), 
                                30, cv::Size(640, 480), true);
    
    if (can_write) {
        std::cout << "✓ Video writing supported" << std::endl;
        writer.release();
        remove("test_video.avi");
    } else {
        std::cout << "✗ Video writing not supported" << std::endl;
    }
    
    // 获取编译信息
    std::cout << "\n=== OpenCV Build Information ===" << std::endl;
    std::string buildInfo = cv::getBuildInformation();
    
    // 提取关键信息
    std::stringstream ss(buildInfo);
    std::string line;
    int gstCount = 0;
    int ffmpegCount = 0;
    
    while (std::getline(ss, line) && (gstCount < 5 || ffmpegCount < 5)) {
        if (line.find("GStreamer") != std::string::npos) {
            std::cout << line << std::endl;
            gstCount++;
        } else if (line.find("FFMPEG") != std::string::npos || 
                  line.find("FFmpeg") != std::string::npos ||
                  line.find("ffmpeg") != std::string::npos) {
            std::cout << line << std::endl;
            ffmpegCount++;
        } else if (line.find("Video I/O") != std::string::npos) {
            std::cout << line << std::endl;
        }
    }
    
    return 0;
}
EOF

# 编译测试
echo "=== 编译测试程序 ==="
g++ -o test_opencv_gst test_opencv_gst.cpp \
    $(pkg-config --cflags --libs opencv4) \
    -std=c++11

echo -e "\n=== 运行测试 ==="
./test_opencv_gst

# 清理
rm -f test_opencv_gst test_opencv_gst.cpp

执行./s1-test.sh后,我的如下结果:

./s1-test.sh 
=== 编译测试程序 ===

=== 运行测试 ===
OpenCV version: 4.6.0
Checking GStreamer support (new method)...

Testing GStreamer pipeline directly...
[ WARN:0@0.020] global ./modules/videoio/src/cap_gstreamer.cpp (1405) open OpenCV | GStreamer warning: Cannot query video position: status=1, value=0, duration=-1
✓ VideoCapture opened successfully (auto-detected backend)
[ WARN:0@0.024] global ./modules/videoio/src/cap_gstreamer.cpp (1405) open OpenCV | GStreamer warning: Cannot query video position: status=1, value=0, duration=-1
✓ GStreamer backend: WORKING

Testing FFmpeg backend (corrected method)...
FFmpeg backend available: YES
Testing FFmpeg file I/O capability...
✓ Image write successful
✓ Image read successful: 100x100
✓ FFmpeg backend: WORKING (file I/O)

Testing video file support...
✓ Video writing supported

=== OpenCV Build Information ===
  Video I/O:
    FFMPEG:                      YES
    GStreamer:                   YES (1.24.1)

有了大模型就是爽:
在这里插入图片描述

2 安装编译videoPipe必要的开发包

接下来安装编译videoPipe必要的开发包,vim s2-install_videopipe_package.sh复制如下内容:

#!/bin/bash
set -e

echo "=== 安装 VideoPipe 依赖包 ==="

# 更新包列表
sudo apt-get update

# 安装开发工具和编译依赖
sudo apt-get install -y \
    build-essential \
    cmake \
    git \
    wget \
    curl \
    pkg-config \
    ninja-build \
    meson

# 安装 OpenCV 开发包
sudo apt-get install -y \
    libopencv-dev \
    libopencv-core-dev \
    libopencv-videoio-dev \
    libopencv-highgui-dev \
    libopencv-imgproc-dev \
    python3-opencv

# 安装 GStreamer 开发包
sudo apt-get install -y \
    libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev \
    libgstreamer-plugins-good1.0-dev \
    gstreamer1.0-plugins-base \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav

# 安装 FFmpeg 开发包
sudo apt-get install -y \
    libavcodec-dev \
    libavformat-dev \
    libavutil-dev \
    libswscale-dev \
    libswresample-dev \
    libavdevice-dev \
    libavfilter-dev \
    libpostproc-dev

# 安装视频编码库
sudo apt-get install -y \
    libx264-dev \
    libx265-dev \
    libvpx-dev \
    libfdk-aac-dev

# 安装音频编码库
sudo apt-get install -y \
    libmp3lame-dev \
    libopus-dev \
    libvorbis-dev
    
# 安装gstrtspserver
sudo apt-get install -y \
    libgstrtspserver-1.0-dev \
    gstreamer1.0-rtsp \
    libgstrtspserver-1.0-0

# 安装其他依赖
sudo apt-get install -y \
    libgtk-3-dev \
    libcurl4-openssl-dev \
    libboost-all-dev \
    libtbb-dev \
    libeigen3-dev
    
echo "=== 安装完成 ==="

# 验证安装
echo "=== 验证安装结果 ==="
pkg-config --exists opencv4 && echo "✓ OpenCV 4 已安装" || echo "✗ OpenCV 4 未找到"
pkg-config --exists gstreamer-1.0 && echo "✓ GStreamer 已安装" || echo "✗ GStreamer 未找到"
pkg-config --exists libavcodec && echo "✓ FFmpeg 已安装" || echo "✗ FFmpeg 未找到"
pkg-config --exists gstreamer-rtsp-server-1.0 && echo "✓ RTSP 服务器包安装成功"

which cmake && echo "✓ CMake 已安装" || echo "✗ CMake 未找到"
which g++ && echo "✓ G++ 已安装" || echo "✗ G++ 未找到"

安装成功后,验证下,如下验证脚本,vim s3-varify_package.sh

# 验证包是否安装成功
echo "=== 验证包安装 ==="
dpkg -l | grep -E "libopencv|gstreamer|libav" | head -10

# 验证 pkg-config
echo "=== 验证 pkg-config ==="
pkg-config --cflags --libs opencv4 2>/dev/null && echo "✓ OpenCV pkg-config 正常" || echo "✗ OpenCV pkg-config 异常"
pkg-config --cflags --libs gstreamer-1.0 2>/dev/null && echo "✓ GStreamer pkg-config 正常" || echo "✗ GStreamer pkg-config 异常"

# 验证命令行工具
echo "=== 验证命令行工具 ==="
cmake --version && echo "✓ CMake 正常"
g++ --version && echo "✓ G++ 正常"
gst-launch-1.0 --version && echo "✓ GStreamer 正常"

这是我的验证结果

root@yhb-VMware-Virtual-Platform:/share/code/videopipe/install# ./s3-varify_package.sh 
=== 验证包安装 ===
ii  gir1.2-gstreamer-1.0:amd64                     1.24.2-1ubuntu0.1                        amd64        GObject introspection data for the GStreamer library
ii  gstreamer1.0-alsa:amd64                        1.24.2-1ubuntu0.3                        amd64        GStreamer plugin for ALSA
ii  gstreamer1.0-gl:amd64                          1.24.2-1ubuntu0.3                        amd64        GStreamer plugins for GL
ii  gstreamer1.0-libav:amd64                       1.24.1-1build1                           amd64        ffmpeg plugin for GStreamer
ii  gstreamer1.0-packagekit                        1.2.8-2ubuntu1.2                         amd64        GStreamer plugin to install codecs using PackageKit
ii  gstreamer1.0-pipewire:amd64                    1.0.5-1ubuntu3.1                         amd64        GStreamer 1.0 plugin for the PipeWire multimedia server
ii  gstreamer1.0-plugins-bad:amd64                 1.24.2-1ubuntu4                          amd64        GStreamer plugins from the "bad" set
ii  gstreamer1.0-plugins-base:amd64                1.24.2-1ubuntu0.3                        amd64        GStreamer plugins from the "base" set
ii  gstreamer1.0-plugins-base-apps                 1.24.2-1ubuntu0.3                        amd64        GStreamer helper programs from the "base" set
ii  gstreamer1.0-plugins-good:amd64                1.24.2-1ubuntu1.2                        amd64        GStreamer plugins from the "good" set
=== 验证 pkg-config ===
-I/usr/include/opencv4 -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core 
✓ OpenCV pkg-config 正常
-I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -pthread -I/usr/include/x86_64-linux-gnu -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 
✓ GStreamer pkg-config 正常
=== 验证命令行工具 ===
cmake version 3.28.3

CMake suite maintained and supported by Kitware (kitware.com/cmake).
✓ CMake 正常
g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

✓ G++ 正常
gst-launch-1.0 version 1.24.2
GStreamer 1.24.2
https://launchpad.net/ubuntu/+source/gstreamer1.0
✓ GStreamer 正常

3 编译环境测试

vim s4-test-compile-env.sh
复制如下sh脚本:

cat > final_fix_compile.sh << 'EOF'
#!/bin/bash
echo "=== 完整修复编译测试 ==="

# 安装缺失的开发包
echo "1. 安装缺失的开发包..."
sudo apt-get install -y \
    libglib2.0-dev \
    libgstreamer-plugins-base1.0-dev

cat > final_test.cpp << 'FINAL_EOF'
#include <iostream>

// 正确的头文件包含顺序
#include <glib.h>  // 必须先包含 GLib
extern "C" {
#include <libavutil/avutil.h>
#include <libavcodec/avcodec.h>
}
#include <opencv2/opencv.hpp>
#include <gst/gst.h>

int main() {
    std::cout << "=== 完整修复测试 ===\n";
    
    // OpenCV
    std::cout << "OpenCV 版本: " << CV_VERSION << "\n";
    
    // GStreamer
    gst_init(NULL, NULL);
    guint major, minor, micro, nano;
    gst_version(&major, &minor, &micro, &nano);
    std::cout << "GStreamer 版本: " << major << "." << minor << "." << micro << "\n";
    
    // FFmpeg
    std::cout << "FFmpeg 版本: " << av_version_info() << "\n";
    
    std::cout << "✓ 所有依赖库编译测试通过\n";
    return 0;
}
FINAL_EOF

echo "2. 使用正确的编译标志..."
# 方法1:添加必需的宏定义
g++ -o final_test final_test.cpp \
    -D__STDC_CONSTANT_MACROS \
    -D__STDC_FORMAT_MACROS \
    $(pkg-config --cflags --libs opencv4 gstreamer-1.0 glib-2.0) \
    -lavcodec -lavutil -lavformat -lswscale -lswresample \
    -std=c++17

if [ $? -eq 0 ]; then
    echo "✓ 编译成功"
    ./final_test
else
    echo "✗ 方法1失败,尝试方法2..."
    
    # 方法2:更详细的编译命令
    echo "3. 尝试方法2:详细编译参数..."
    g++ -o final_test final_test.cpp \
        -D__STDC_CONSTANT_MACROS \
        -D__STDC_FORMAT_MACROS \
        -I/usr/include/opencv4 \
        -I/usr/include/gstreamer-1.0 \
        -I/usr/include/glib-2.0 \
        -I/usr/lib/x86_64-linux-gnu/glib-2.0/include \
        -I/usr/include/x86_64-linux-gnu \
        -lopencv_core -lopencv_highgui -lopencv_videoio \
        -lgstreamer-1.0 -lgstbase-1.0 -lgobject-2.0 -lglib-2.0 \
        -lavcodec -lavutil -lavformat -lswscale -lswresample \
        -std=c++17
    
    if [ $? -eq 0 ]; then
        echo "✓ 编译成功"
        ./final_test
    else
        echo "✗ 方法2失败,尝试简化测试..."
        
        # 方法3:分步测试
        echo "4. 分步测试各组件..."
        
        # 测试 FFmpeg
        cat > test_ffmpeg_only.cpp << 'FFMPEG_EOF'
#include <iostream>
#define __STDC_CONSTANT_MACROS
#define __STDC_FORMAT_MACROS
extern "C" {
#include <libavutil/avutil.h>
}
int main() {
    std::cout << "FFmpeg 版本: " << av_version_info() << std::endl;
    return 0;
}
FFMPEG_EOF
        
        g++ -o test_ffmpeg test_ffmpeg_only.cpp \
            -D__STDC_CONSTANT_MACROS \
            -D__STDC_FORMAT_MACROS \
            -lavutil && echo "✓ FFmpeg 测试通过" && ./test_ffmpeg
        
        # 测试 GStreamer
        cat > test_gstreamer_only.cpp << 'GST_EOF'
#include <iostream>
#include <glib.h>
#include <gst/gst.h>
int main() {
    gst_init(NULL, NULL);
    guint major, minor, micro, nano;
    gst_version(&major, &minor, &micro, &nano);
    std::cout << "GStreamer 版本: " << major << "." << minor << "." << micro << std::endl;
    return 0;
}
GST_EOF
        
        g++ -o test_gstreamer test_gstreamer_only.cpp \
            $(pkg-config --cflags --libs gstreamer-1.0 glib-2.0) && \
            echo "✓ GStreamer 测试通过" && ./test_gstreamer
    fi
fi
EOF

chmod +x final_fix_compile.sh
./final_fix_compile.sh
rm -rf ./final_fix_compile.sh

如下结果:

./s4-test-compile-env.sh 
=== 完整修复编译测试 ===
1. 安装缺失的开发包...
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
libglib2.0-dev 已经是最新版 (2.80.0-6ubuntu3.7)。
libglib2.0-dev 已设置为手动安装。
libgstreamer-plugins-base1.0-dev 已经是最新版 (1.24.2-1ubuntu0.3)。
下列软件包是自动安装的并且现在不需要了:
  libllvm19
使用'sudo apt autoremove'来卸载它(它们)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 125 个软件包未被升级。
2. 使用正确的编译标志...
✓ 编译成功
=== 完整修复测试 ===
OpenCV 版本: 4.6.0
GStreamer 版本: 1.24.2
FFmpeg 版本: 6.1.1-3ubuntu5
✓ 所有依赖库编译测试通过

4.编译VideoPipe

4.1 下载videpipe源码

git clone https://github.com/sherlockchou86/VideoPipe.git

我是用国内的gitee我之前从github上同步过来的进行下载:
git clone https://gitee.com/lure_ai/VideoPipe.git

4.2 编译

先看下我的最终脚本位置:
在这里插入图片描述
我是放到VideoPipe源码外面的,但是里面外面都可以,这些脚本会检查VideoPipe目录在哪,主要要是这个目录名字一样。或者脚本都可以改。

然后vim s5-compile.sh,复制如下脚本内容:

#!/bin/bash
echo "=== VideoPipe 智能编译配置脚本(带配置检测版)==="

# 设置编译环境
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
export CXXFLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

# 检查目录
if [ -f "CMakeLists.txt" ] && [ -d "nodes" ]; then
    echo "✓ 在 VideoPipe 根目录"
    VP_DIR="."
elif [ -d "VideoPipe" ] && [ -f "VideoPipe/CMakeLists.txt" ]; then
    echo "✓ 检测到 VideoPipe 子目录"
    VP_DIR="VideoPipe"
    cd "$VP_DIR"
else
    echo "错误: 未找到 VideoPipe 项目"
    exit 1
fi

echo "工作目录: $(pwd)"

# 显示可用的编译选项
echo "=== 可用的编译选项 ==="
echo "根据 README.md,VideoPipe 支持以下选项:"
echo "-DVP_WITH_CUDA=ON          # CUDA 支持"
echo "-DVP_WITH_TRT=ON           # TensorRT 支持"
echo "-DVP_WITH_PADDLE=ON        # PaddlePaddle 支持"
echo "-DVP_WITH_KAFKA=ON         # Kafka 支持"
echo "-DVP_WITH_LLM=ON           # LLM 支持"
echo "-DVP_WITH_FFMPEG=ON        # FFMPEG 支持"
echo "-DVP_BUILD_COMPLEX_SAMPLES=ON  # 高级示例"

# 简化为单一配置选择
echo "请选择编译配置:"
echo "1) 完整功能(启用所有AI框架和高级示例)"
echo "2) 基础功能(仅CPU模式,禁用高级示例)"  
echo "3) 自定义功能"
read -p "请选择 (1/2/3): " config_choice

# 基础配置模板
BASE_OPTIONS="\
    -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_CXX_STANDARD=17 \
    -D CMAKE_CXX_FLAGS=\"-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS\" \
    -D VP_WITH_OPENCV=ON \
    -D VP_WITH_GSTREAMER=ON"

case $config_choice in
    1)
        # 完整功能配置
        echo "选择:完整功能配置"
        CMAKE_OPTIONS="$BASE_OPTIONS \
            -D VP_WITH_FFMPEG=ON \
            -D VP_WITH_CUDA=ON \
            -D VP_WITH_TRT=ON \
            -D VP_WITH_PADDLE=ON \
            -D VP_WITH_KAFKA=ON \
            -D VP_WITH_LLM=ON \
            -D VP_BUILD_COMPLEX_SAMPLES=ON"
        CONFIG_DESC="完整功能(所有AI框架,启用高级示例)"
        ;;
    2)
        # 基础功能配置
        echo "选择:基础功能配置"
        CMAKE_OPTIONS="$BASE_OPTIONS \
            -D VP_WITH_FFMPEG=ON \
            -D VP_WITH_CUDA=OFF \
            -D VP_WITH_TRT=OFF \
            -D VP_WITH_PADDLE=OFF \
            -D VP_WITH_KAFKA=OFF \
            -D VP_WITH_LLM=OFF"
        CONFIG_DESC="基础功能(仅CPU模式,禁用高级示例)"
        ;;
    3)
        # 自定义功能配置
        echo "选择:自定义功能配置"
        echo "请逐个选择功能选项:"
        
        read -p "启用 FFMPEG 支持? (y/n) [默认y]: " enable_ffmpeg
        read -p "启用 CUDA 支持? (y/n) [默认n]: " enable_cuda
        read -p "启用 TensorRT 支持? (y/n) [默认n]: " enable_trt
        read -p "启用 PaddlePaddle 支持? (y/n) [默认n]: " enable_paddle
        read -p "启用 Kafka 支持? (y/n) [默认n]: " enable_kafka
        read -p "启用 LLM 支持? (y/n) [默认n]: " enable_llm
        read -p "启用高级示例? (y/n) [默认n]: " enable_complex
        
        CMAKE_OPTIONS="$BASE_OPTIONS"
        
        # 设置默认值
        enable_ffmpeg=${enable_ffmpeg:-y}
        enable_cuda=${enable_cuda:-n}
        enable_trt=${enable_trt:-n}
        enable_paddle=${enable_paddle:-n}
        enable_kafka=${enable_kafka:-n}
        enable_llm=${enable_llm:-n}
        enable_complex=${enable_complex:-n}
        
        [ "$enable_ffmpeg" = "y" ] && CMAKE_OPTIONS="$CMAKE_OPTIONS -D VP_WITH_FFMPEG=ON"
        [ "$enable_cuda" = "y" ] && CMAKE_OPTIONS="$CMAKE_OPTIONS -D VP_WITH_CUDA=ON"
        [ "$enable_trt" = "y" ] && CMAKE_OPTIONS="$CMAKE_OPTIONS -D VP_WITH_TRT=ON"
        [ "$enable_paddle" = "y" ] && CMAKE_OPTIONS="$CMAKE_OPTIONS -D VP_WITH_PADDLE=ON"
        [ "$enable_kafka" = "y" ] && CMAKE_OPTIONS="$CMAKE_OPTIONS -D VP_WITH_KAFKA=ON"
        [ "$enable_llm" = "y" ] && CMAKE_OPTIONS="$CMAKE_OPTIONS -D VP_WITH_LLM=ON"
        [ "$enable_complex" = "y" ] && CMAKE_OPTIONS="$CMAKE_OPTIONS -D VP_BUILD_COMPLEX_SAMPLES=ON"
        
        CONFIG_DESC="自定义功能"
        ;;
    *)
        echo "无效选择,使用基础功能配置"
        CMAKE_OPTIONS="$BASE_OPTIONS \
            -D VP_WITH_FFMPEG=ON \
            -D VP_WITH_CUDA=OFF \
            -D VP_WITH_TRT=OFF \
            -D VP_WITH_PADDLE=OFF \
            -D VP_WITH_KAFKA=OFF \
            -D VP_WITH_LLM=OFF"
        CONFIG_DESC="基础功能(默认)"
        ;;
esac

# 统一的编译流程
echo "准备构建环境..."
if [ ! -d "build" ]; then
    mkdir build
fi
cd build

echo ""
echo "=== 配置变更检测 ==="

if [ -f "CMakeCache.txt" ]; then
    echo "检查配置兼容性..."
    echo "1. 新配置 (CMAKE_OPTIONS):"
    echo "$CMAKE_OPTIONS"
    echo ""
    
    echo "2. 提取的配置项:"
	# 修复配置提取:处理带引号的配置值
	CLEANED_CONFIG=$(echo "$CMAKE_OPTIONS" | sed 's/ -D / -D/g' | sed 's/[[:space:]]\+/ /g')

	# 使用改进的正则表达式
	EXTRACTED_CONFIGS=$(echo "$CLEANED_CONFIG" | grep -oE '\-D[^= ]+="[^"]+"|\-D[^= ]+=[^ ]+')

	if [ -n "$EXTRACTED_CONFIGS" ]; then
		echo "$EXTRACTED_CONFIGS"
	else
		echo "⚠️ 未提取到配置项,尝试备用方法..."
		
		# 备用方法:手动解析
		echo "$CLEANED_CONFIG" | awk '{
			for(i=1; i<=NF; i++) {
				if ($i ~ /^-D/) {
					config = $i
					# 检查是否有等号
					if (config ~ /=/) {
						# 如果值包含空格且在引号内,继续拼接
						while (i < NF && config !~ /"$/ && $(i+1) !~ /^-D/) {
							i++
							config = config " " $i
						}
						print config
					}
				}
			}
		}'
	fi

    echo ""
    echo "3. 当前缓存中的相关配置:"
    grep -E "VP_|COMPLEX" CMakeCache.txt 2>/dev/null || echo "未找到相关配置"
    echo ""
    
	echo "4. 关键配置对比:"

	# 需要对比的关键配置(用户可能修改的)
	KEY_CONFIGS=(
		"VP_BUILD_COMPLEX_SAMPLES"
		"VP_WITH_CUDA" 
		"VP_WITH_TRT"
		"VP_WITH_PADDLE"
		"VP_WITH_KAFKA"
		"VP_WITH_LLM"
		"VP_WITH_FFMPEG"
	)

	CONFLICT_DETECTED=false
	CONFLICT_COUNT=0

	for config in "${KEY_CONFIGS[@]}"; do
		# 从新配置中提取值
		NEW_VAL=$(echo "$CMAKE_OPTIONS" | grep -o "${config}=[^ ]*" | cut -d= -f2)
		# 从缓存中提取当前值
		CURRENT_VAL=$(grep "${config}:BOOL=" CMakeCache.txt 2>/dev/null | cut -d= -f2)
		
		# 处理空值(未设置默认为 OFF)
		NEW_VAL=${NEW_VAL:-OFF}
		CURRENT_VAL=${CURRENT_VAL:-OFF}
		
		if [ "$CURRENT_VAL" != "$NEW_VAL" ]; then
			echo "  ❌ $config: 冲突 ($CURRENT_VAL$NEW_VAL)"
			CONFLICT_DETECTED=true
			((CONFLICT_COUNT++))
		else
			echo "  ✅ $config: 一致 ($CURRENT_VAL)"
		fi
	done

	# 处理检测结果
	if [ "$CONFLICT_DETECTED" = "true" ]; then
		echo ""
		echo "❌ 检测到 $CONFLICT_COUNT 个配置冲突,清理缓存确保新配置生效..."
		rm -f CMakeCache.txt CMakeFiles/*.cmake 2>/dev/null || true
		echo "✅ 缓存已清理"
	else
		echo ""
		echo "✅ 所有关键配置一致,复用现有缓存"
	fi	

else
    echo "ℹ️ 无现有缓存,创建新配置"
fi

echo ""
echo "=== 最终配置摘要 ==="
echo "功能配置: $CONFIG_DESC"

# 打印实际使用的宏定义
echo ""
echo "=== 实际使用的 CMake 宏定义 ==="
echo "完整的 CMake 选项字符串:"
echo "$CMAKE_OPTIONS"
echo ""

echo "解析后的宏定义列表:"
echo "-------------------"
# 使用可靠的方法解析宏定义
temp_file=$(mktemp)
echo "$CMAKE_OPTIONS" > "$temp_file"
grep -oE '\-D[^ ]+' "$temp_file" | sed 's/^-D//' | sort | while read macro; do
    if [ -n "$macro" ]; then
        echo "  $macro"
    fi
done
rm -f "$temp_file"
echo "-------------------"
echo ""

echo "配置 CMake..."
eval cmake .. $CMAKE_OPTIONS

if [ $? -ne 0 ]; then
    echo "✗ CMake 配置失败"
    exit 1
fi

echo "开始编译..."
# 使用所有核心编译
make -j$(nproc)

if [ $? -eq 0 ]; then
    echo "✅ 编译成功"
else
    echo "❌ 编译失败"  
    exit 1
fi

# 关键文件验证(根据配置区分)
echo ""
echo "=== 关键文件验证 ==="

case "$config_choice" in
    1)
        # 完整功能:验证所有文件
        echo "完整功能验证:"
        
        # 1. 核心库验证
        echo "核心库文件验证:"
        CORE_LIBS=("libvideo_pipe.so" "libtinyexpr.so")
        for lib in "${CORE_LIBS[@]}"; do
            if find . -name "$lib" 2>/dev/null | grep -q .; then
                lib_path=$(find . -name "$lib" 2>/dev/null | head -1)
                echo "  ✅ $lib: 存在 ($(stat -c%s "$lib_path") bytes)"
            else
                echo "  ❌ $lib: 未找到"
            fi
        done
        
        # 2. 基础 samples 验证
        echo ""
        echo "基础 Samples 验证:"
        BASE_SAMPLES=("1-1-1_sample" "face_tracking_sample")
        BASE_MISSING=0
        for sample in "${BASE_SAMPLES[@]}"; do
            if [ -f "bin/$sample" ]; then
                echo "  ✅ $sample: 存在"
            else
                echo "  ❌ $sample: 未找到"
                ((BASE_MISSING++))
            fi
        done
        
        # 3. 高级 samples 验证
        echo ""
        echo "高级 Samples 验证:"
        ADVANCED_SAMPLES=("vehicle_tracking_sample" "trt_infer_sample" "paddle_infer_sample")
        ADVANCED_FOUND=0
        for sample in "${ADVANCED_SAMPLES[@]}"; do
            if [ -f "bin/$sample" ]; then
                echo "  ✅ $sample: 存在"
                ((ADVANCED_FOUND++))
            else
                echo "  ⚠️ $sample: 未找到(可能配置问题)"
            fi
        done
        
        # 验证总结
        echo ""
        if [ $BASE_MISSING -eq 0 ] && [ $ADVANCED_FOUND -gt 0 ]; then
            echo "✅ 完整功能验证通过:基础 samples $BASE_MISSING 缺失,高级 samples 找到 $ADVANCED_FOUND 个"
        elif [ $BASE_MISSING -eq 0 ]; then
            echo "⚠️ 基础功能正常,但高级 samples 缺失(可能配置问题)"
        else
            echo "❌ 基础 samples 缺失 $BASE_MISSING 个,编译可能有问题"
        fi
        ;;
    2)
        # 基础功能:只验证核心库和基础 samples
        echo "基础功能验证:"
        
        # 1. 核心库验证
        echo "核心库文件验证:"
        CORE_LIBS=("libvideo_pipe.so" "libtinyexpr.so")
        CORE_MISSING=0
        for lib in "${CORE_LIBS[@]}"; do
            if find . -name "$lib" 2>/dev/null | grep -q .; then
                lib_path=$(find . -name "$lib" 2>/dev/null | head -1)
                echo "  ✅ $lib: 存在 ($(stat -c%s "$lib_path") bytes)"
            else
                echo "  ❌ $lib: 未找到"
                ((CORE_MISSING++))
            fi
        done
        
        # 2. 基础 samples 验证
        echo ""
        echo "基础 Samples 验证:"
        BASE_SAMPLES=("1-1-1_sample" "face_tracking_sample")
        BASE_MISSING=0
        for sample in "${BASE_SAMPLES[@]}"; do
            if [ -f "bin/$sample" ]; then
                echo "  ✅ $sample: 存在"
            else
                echo "  ❌ $sample: 未找到"
                ((BASE_MISSING++))
            fi
        done
        
        # 3. 验证不应存在高级 samples
        echo ""
        echo "高级 Samples 检查(应不存在):"
        ADVANCED_SAMPLES=("vehicle_tracking_sample" "trt_infer_sample" "paddle_infer_sample")
        ADVANCED_FOUND=0
        for sample in "${ADVANCED_SAMPLES[@]}"; do
            if [ -f "bin/$sample" ]; then
                echo "  ⚠️ $sample: 存在(不应在基础功能中出现)"
                ((ADVANCED_FOUND++))
            else
                echo "  ✅ $sample: 不存在(符合基础功能配置)"
            fi
        done
        
        # 验证总结
        echo ""
        if [ $CORE_MISSING -eq 0 ] && [ $BASE_MISSING -eq 0 ] && [ $ADVANCED_FOUND -eq 0 ]; then
            echo "✅ 基础功能验证通过:核心库和基础 samples 正常,无高级 samples"
        elif [ $ADVANCED_FOUND -gt 0 ]; then
            echo "⚠️ 基础功能异常:发现 $ADVANCED_FOUND 个高级 samples(配置可能有问题)"
        else
            echo "❌ 基础功能编译问题:核心库缺失 $CORE_MISSING 个,基础 samples 缺失 $BASE_MISSING 个"
        fi
        ;;
    3)
        # 自定义功能:智能验证
        echo "自定义功能验证:"
        
        # 1. 核心库验证(必须存在)
        echo "核心库验证(必须存在):"
        CORE_LIBS=("libvideo_pipe.so" "libtinyexpr.so")
        CORE_MISSING=0
        for lib in "${CORE_LIBS[@]}"; do
            if find . -name "$lib" 2>/dev/null | grep -q .; then
                lib_path=$(find . -name "$lib" 2>/dev/null | head -1)
                echo "  ✅ $lib: 存在"
            else
                echo "  ❌ $lib: 未找到(必需库缺失)"
                ((CORE_MISSING++))
            fi
        done
        
        # 2. 基础 samples 验证(应该存在)
        echo ""
        echo "基础 Samples 验证(应该存在):"
        BASE_SAMPLES=("1-1-1_sample" "face_tracking_sample")
        BASE_MISSING=0
        for sample in "${BASE_SAMPLES[@]}"; do
            if [ -f "bin/$sample" ]; then
                echo "  ✅ $sample: 存在"
            else
                echo "  ❌ $sample: 未找到"
                ((BASE_MISSING++))
            fi
        done
        
        # 3. 条件 samples 验证(根据配置)
        echo ""
        echo "条件 Samples 验证(根据配置):"
        
        # 检查配置状态
        if grep -q "VP_BUILD_COMPLEX_SAMPLES:BOOL=ON" CMakeCache.txt 2>/dev/null; then
            echo "高级示例已启用,验证高级 samples:"
            ADVANCED_SAMPLES=("vehicle_tracking_sample" "trt_infer_sample" "paddle_infer_sample")
            ADVANCED_FOUND=0
            for sample in "${ADVANCED_SAMPLES[@]}"; do
                if [ -f "bin/$sample" ]; then
                    echo "  ✅ $sample: 存在(符合配置)"
                    ((ADVANCED_FOUND++))
                else
                    echo "  ⚠️ $sample: 未找到(配置启用但文件缺失)"
                fi
            done
        else
            echo "高级示例已禁用,检查是否误生成:"
            ADVANCED_SAMPLES=("vehicle_tracking_sample" "trt_infer_sample" "paddle_infer_sample")
            ADVANCED_FOUND=0
            for sample in "${ADVANCED_SAMPLES[@]}"; do
                if [ -f "bin/$sample" ]; then
                    echo "  ⚠️ $sample: 存在(配置禁用但文件存在)"
                    ((ADVANCED_FOUND++))
                else
                    echo "  ✅ $sample: 不存在(符合配置)"
                fi
            done
        fi
        
        # 验证总结
        echo ""
        if [ $CORE_MISSING -eq 0 ] && [ $BASE_MISSING -eq 0 ]; then
            echo "✅ 自定义功能验证通过:核心功能正常"
            if grep -q "VP_BUILD_COMPLEX_SAMPLES:BOOL=ON" CMakeCache.txt 2>/dev/null; then
                echo "   高级示例状态:启用,找到 $ADVANCED_FOUND 个高级 samples"
            else
                echo "   高级示例状态:禁用,符合配置"
            fi
        else
            echo "❌ 自定义功能编译问题:核心库缺失 $CORE_MISSING 个,基础 samples 缺失 $BASE_MISSING 个"
        fi
        ;;
    *)
        echo "⚠️ 未知的配置选择"
        ;;
esac

echo ""
echo "=== 编译结果统计 ==="
echo "生成的可执行文件:"
find bin/ -type f -executable 2>/dev/null | head -10
echo "总数:$(find bin/ -type f -executable 2>/dev/null | wc -l)"

echo "生成的库文件:"
find . -name "*.so" -o -name "*.a" 2>/dev/null | head -10
echo "总数:$(find . -name "*.so" -o -name "*.a" 2>/dev/null | wc -l)"

echo ""
echo "构建目录: $(pwd)"
echo "功能配置: $CONFIG_DESC"
echo "构建时间: $(date)"
echo "构建完成"

可以看到如上内容的脚本s5-compile.sh编译有3个选择

4.2.1 基本功能编译选项

其中选择编译基本功能如下:

./s5-compile.sh 
=== VideoPipe 智能编译配置脚本(带配置检测版)===
✓ 检测到 VideoPipe 子目录
工作目录: /share/code/videopipe/VideoPipe
=== 可用的编译选项 ===
根据 README.md,VideoPipe 支持以下选项:
-DVP_WITH_CUDA=ON          # CUDA 支持
-DVP_WITH_TRT=ON           # TensorRT 支持
-DVP_WITH_PADDLE=ON        # PaddlePaddle 支持
-DVP_WITH_KAFKA=ON         # Kafka 支持
-DVP_WITH_LLM=ON           # LLM 支持
-DVP_WITH_FFMPEG=ON        # FFMPEG 支持
-DVP_BUILD_COMPLEX_SAMPLES=ON  # 高级示例
请选择编译配置:
1) 完整功能(启用所有AI框架和高级示例)
2) 基础功能(仅CPU模式,禁用高级示例)
3) 自定义功能
请选择 (1/2/3): 2
选择:基础功能配置
准备构建环境...

=== 配置变更检测 ===
检查配置兼容性...
1. 新配置 (CMAKE_OPTIONS):
    -D CMAKE_BUILD_TYPE=Release     -D CMAKE_CXX_STANDARD=17     -D CMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"     -D VP_WITH_OPENCV=ON     -D VP_WITH_GSTREAMER=ON             -D VP_WITH_FFMPEG=ON             -D VP_WITH_CUDA=OFF             -D VP_WITH_TRT=OFF             -D VP_WITH_PADDLE=OFF             -D VP_WITH_KAFKA=OFF             -D VP_WITH_LLM=OFF

2. 提取的配置项:
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_CXX_STANDARD=17
-DCMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
-DVP_WITH_OPENCV=ON
-DVP_WITH_GSTREAMER=ON
-DVP_WITH_FFMPEG=ON
-DVP_WITH_CUDA=OFF
-DVP_WITH_TRT=OFF
-DVP_WITH_PADDLE=OFF
-DVP_WITH_KAFKA=OFF
-DVP_WITH_LLM=OFF

3. 当前缓存中的相关配置:
VP_BUILD_COMPLEX_SAMPLES:BOOL=OFF
VP_WITH_CUDA:BOOL=OFF
VP_WITH_FFMPEG:BOOL=ON
VP_WITH_GSTREAMER:UNINITIALIZED=ON
VP_WITH_KAFKA:BOOL=OFF
VP_WITH_LLM:BOOL=OFF
VP_WITH_OPENCV:UNINITIALIZED=ON
VP_WITH_PADDLE:BOOL=OFF
VP_WITH_TRT:BOOL=OFF

4. 关键配置对比:
  ✅ VP_BUILD_COMPLEX_SAMPLES: 一致 (OFF)
  ✅ VP_WITH_CUDA: 一致 (OFF)
  ✅ VP_WITH_TRT: 一致 (OFF)
  ✅ VP_WITH_PADDLE: 一致 (OFF)
  ✅ VP_WITH_KAFKA: 一致 (OFF)
  ✅ VP_WITH_LLM: 一致 (OFF)
  ✅ VP_WITH_FFMPEG: 一致 (ON)

✅ 所有关键配置一致,复用现有缓存

=== 最终配置摘要 ===
功能配置: 基础功能(仅CPU模式,禁用高级示例)

=== 实际使用的 CMake 宏定义 ===
完整的 CMake 选项字符串:
    -D CMAKE_BUILD_TYPE=Release     -D CMAKE_CXX_STANDARD=17     -D CMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"     -D VP_WITH_OPENCV=ON     -D VP_WITH_GSTREAMER=ON             -D VP_WITH_FFMPEG=ON             -D VP_WITH_CUDA=OFF             -D VP_WITH_TRT=OFF             -D VP_WITH_PADDLE=OFF             -D VP_WITH_KAFKA=OFF             -D VP_WITH_LLM=OFF

解析后的宏定义列表:
-------------------
  __STDC_CONSTANT_MACROS
  __STDC_FORMAT_MACROS"
-------------------

配置 CMake...
-- OpenCV library status:
--     version: 4.6.0
--     libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_alphamat;opencv_aruco;opencv_barcode;opencv_bgsegm;opencv_bioinspired;opencv_ccalib;opencv_cvv;opencv_datasets;opencv_dnn_objdetect;opencv_dnn_superres;opencv_dpm;opencv_face;opencv_freetype;opencv_fuzzy;opencv_hdf;opencv_hfs;opencv_img_hash;opencv_intensity_transform;opencv_line_descriptor;opencv_mcc;opencv_optflow;opencv_phase_unwrapping;opencv_plot;opencv_quality;opencv_rapid;opencv_reg;opencv_rgbd;opencv_saliency;opencv_shape;opencv_stereo;opencv_structured_light;opencv_superres;opencv_surface_matching;opencv_text;opencv_tracking;opencv_videostab;opencv_viz;opencv_wechat_qrcode;opencv_ximgproc;opencv_xobjdetect;opencv_xphoto
--     include path: /usr/include/opencv4
-- GStreamer library status:
--     version: 1.24.2
--     libraries: gstreamer-1.0;gobject-2.0;glib-2.0 gstapp-1.0;gstbase-1.0;gstreamer-1.0;gobject-2.0;glib-2.0 gstrtspserver-1.0;gstreamer-1.0;gobject-2.0;glib-2.0
--     include path: /usr/include/gstreamer-1.0;/usr/include/glib-2.0;/usr/lib/x86_64-linux-gnu/glib-2.0/include;/usr/include;/usr/include/x86_64-linux-gnu
-------------start build tinyexpr--------------
--------------end build tinyexpr---------------
-------------collect version info--------------
fatal: detected dubious ownership in repository at '/mnt/hgfs/code/videopipe/VideoPipe'
To add an exception for this directory, call:

	git config --global --add safe.directory /mnt/hgfs/code/videopipe/VideoPipe
warning: 不是 git 仓库。使用 --no-index 比较工作区之外的两个路径
用法:git diff --no-index [<选项>] <路径> <路径>

差异输出格式化选项
    -p, --patch           生成补丁
    -s, --no-patch        不显示差异输出
    -u                    生成补丁
    -U, --unified[=<n>]   生成含 <n> 行上下文的差异
    -W, --[no-]function-context
                          生成含 <n> 行上下文的差异
    --raw                 生成原始格式的差异
    --patch-with-raw      和 '-p --raw' 同义
    --patch-with-stat     和 '-p --stat' 同义
    --numstat             机器友好的 --stat
    --shortstat           只输出 --stat 的最后一行
    -X, --dirstat[=<参数1,参数2>...]
                          输出每个子目录相对变更的分布
    --cumulative          和 --dirstat=cumulative 同义
    --dirstat-by-file[=<参数1,参数2>...]--dirstat=files,param1,param2... 的同义词
    --check               如果变更中引入冲突定界符或空白错误,给出警告
    --summary             精简摘要,例如创建、重命名和模式变更
    --name-only           只显示变更文件的文件名
    --name-status         只显示变更文件的文件名和状态
    --stat[=<宽度>[,<文件名宽度>[,<次数>]]]
                          生成差异统计(diffstat)
    --stat-width <宽度>   使用给定的长度生成差异统计
    --stat-name-width <宽度>
                          使用给定的文件名长度生成差异统计
    --stat-graph-width <宽度>
                          使用给定的图形长度生成差异统计
    --stat-count <次数>   生成有限行数的差异统计
    --[no-]compact-summary
                          生成差异统计的简洁摘要
    --binary              输出一个可以应用的二进制差异
    --[no-]full-index     在 "index" 行显示完整的前后对象名称
    --[no-]color[=<何时>] 显示带颜色的差异
    --ws-error-highlight <类型>
                          对于差异中的上下文、旧的和新的行,加亮显示错误的空白字符
    -z                    在 --raw 或者 --numstat 中,不对路径字符转码并使用 NUL 字符做为输出字段的分隔符
    --[no-]abbrev[=<n>]<n> 位数字显示对象名
    --src-prefix <前缀>   显示给定的源前缀取代 "a/"
    --dst-prefix <前缀>   显示给定的目标前缀取代 "b/"
    --line-prefix <前缀>  输出的每一行附加前缀
    --no-prefix           不显示任何源和目标前缀
    --default-prefix      use default prefixes a/ and b/
    --inter-hunk-context <n>
                          显示指定行数的差异块间的上下文
    --output-indicator-new <字符>
                          指定一个字符取代 '+' 来表示新的一行
    --output-indicator-old <字符>
                          指定一个字符取代 '-' 来表示旧的一行
    --output-indicator-context <字符>
                          指定一个字符取代 ' ' 来表示一行上下文

差异重命名选项
    -B, --break-rewrites[=<n>[/<m>]]
                          将完全重写的变更打破为成对的删除和创建
    -M, --find-renames[=<n>]
                          检测重命名
    -D, --irreversible-delete
                          省略删除操作的差异输出
    -C, --find-copies[=<n>]
                          检测拷贝
    --[no-]find-copies-harder
                          使用未修改的文件做为发现拷贝的源
    --no-renames          禁用重命名探测
    --[no-]rename-empty   使用空的数据对象做为重命名的源
    --[no-]follow         继续列出文件重命名以外的历史记录
    -l <n>                如果重命名/拷贝目标超过给定的限制,禁止重命名/拷贝检测

差异算法选项
    --minimal             生成尽可能小的差异
    -w, --ignore-all-space
                          行比较时忽略空白字符
    -b, --ignore-space-change
                          忽略空白字符的变更
    --ignore-space-at-eol 忽略行尾的空白字符变更
    --ignore-cr-at-eol    忽略行尾的回车符(CR)
    --ignore-blank-lines  忽略整行都是空白的变更
    -I, --[no-]ignore-matching-lines <正则>
                          忽略所有行都和正则表达式匹配的变更
    --[no-]indent-heuristic
                          启发式转换差异边界以便阅读
    --patience            使用 "patience diff" 算法生成差异
    --histogram           使用 "histogram diff" 算法生成差异
    --diff-algorithm <算法>
                          选择一个差异算法
    --anchored <文本>     使用 "anchored diff" 算法生成差异
    --word-diff[=<模式>]  显示单词差异,使用 <模式> 分隔变更的单词
    --word-diff-regex <正则>
                          使用 <正则表达式> 确定何为一个词
    --color-words[=<正则>]
                          相当于 --word-diff=color --word-diff-regex=<正则>
    --[no-]color-moved[=<模式>]
                          移动的代码行用不同方式着色
    --[no-]color-moved-ws <模式>--color-moved 下如何忽略空白字符

其它差异选项
    --[no-]relative[=<前缀>]
                          当从子目录运行,排除目录之外的变更并显示相对路径
    -a, --[no-]text       把所有文件当做文本处理
    -R                    交换两个输入,反转差异
    --[no-]exit-code      有差异时退出码为 1,否则为 0
    --[no-]quiet          禁用本程序的所有输出
    --[no-]ext-diff       允许执行一个外置的差异助手
    --[no-]textconv       当比较二进制文件时,运行外部的文本转换过滤器
    --ignore-submodules[=<何时>]
                          在生成差异时,忽略子模组的更改
    --submodule[=<格式>]  指定子模组的差异如何显示
    --ita-invisible-in-index
                          隐藏索引中 'git add -N' 条目
    --ita-visible-in-index
                          将索引中 'git add -N' 条目当做真实的
    -S <字符串>           查找改变了指定字符串出现次数的差异
    -G <正则>             查找改变指定正则匹配出现次数的差异
    --pickaxe-all         显示使用 -S 或 -G 的变更集的所有变更
    --pickaxe-regex       将 -S 的 <string> 当做扩展的 POSIX 正则表达式
    -O <文件>             控制输出中的文件显示顺序
    --rotate-to <路径>    先显示指定路径的变更
    --skip-to <路径>      跳过指定路径的输出
    --find-object <对象 ID>
                          查找改变指定对象出现次数的差异
    --diff-filter [(A|C|D|M|R|T|U|X|B)...[*]]
                          通过差异类型选择文件
    --output <文件>       输出到指定的文件

-- version info:
--     build_time: 20260203-154003
--     commit_hash: -dirty
-------------collect version info--------------
start build for simple samples...
-- Configuring done (0.2s)
-- Generating done (1.5s)
-- Build files have been written to: /share/code/videopipe/VideoPipe/build
开始编译...
[  1%] Built target tinyexpr
[  2%] Built target tinyexpr_test
[  3%] Building CXX object CMakeFiles/video_pipe.dir/utils/analysis_board/vp_analysis_board.cpp.o
[  3%] Linking CXX shared library libs/libvideo_pipe.so
[ 65%] Built target video_pipe
[ 67%] Linking CXX executable ../bin/1-1-1_sample
[ 67%] Linking CXX executable ../bin/ba_crossline_sample
[ 67%] Linking CXX executable ../bin/1-N-N_sample
[ 68%] Linking CXX executable ../bin/1-1-N_sample
[ 68%] Built target 1-N-N_sample
[ 68%] Built target 1-1-1_sample
[ 68%] Built target 1-1-N_sample
[ 69%] Built target ba_crossline_sample
[ 69%] Linking CXX executable ../bin/enet_seg_sample
[ 69%] Linking CXX executable ../bin/face_tracking_sample
[ 70%] Linking CXX executable ../bin/image_des_sample
[ 71%] Linking CXX executable ../bin/image_src_sample
[ 72%] Built target enet_seg_sample
[ 73%] Built target face_tracking_sample
[ 73%] Built target image_src_sample
[ 73%] Built target image_des_sample
[ 74%] Linking CXX executable ../bin/interaction_with_pipe_sample
[ 75%] Linking CXX executable ../bin/mask_rcnn_sample
[ 75%] Linking CXX executable ../bin/multi_detectors_and_classifiers_sample
[ 75%] Linking CXX executable ../bin/message_broker_sample
[ 75%] Built target interaction_with_pipe_sample
[ 75%] Built target mask_rcnn_sample
[ 76%] Built target multi_detectors_and_classifiers_sample
[ 77%] Linking CXX executable ../bin/N-1-N_sample
[ 78%] Linking CXX executable ../bin/N-N_sample
[ 79%] Built target message_broker_sample
[ 79%] Linking CXX executable ../bin/openpose_sample
[ 79%] Linking CXX executable ../bin/record_sample
[ 79%] Built target N-N_sample
[ 80%] Built target openpose_sample
[ 80%] Built target N-1-N_sample
[ 80%] Linking CXX executable ../bin/vp_logger_sample
[ 81%] Linking CXX executable ../bin/rtsp_src_sample
[ 82%] Built target record_sample
[ 83%] Linking CXX executable ../bin/rtsp_des_sample
[ 84%] Linking CXX executable ../bin/skip_sample
[ 85%] Built target vp_logger_sample
[ 85%] Built target rtsp_src_sample
[ 86%] Built target rtsp_des_sample
[ 86%] Built target skip_sample
[ 86%] Linking CXX executable ../bin/obstacle_detect_sample
[ 86%] Linking CXX executable ../bin/multi_detectors_sample
[ 86%] Linking CXX executable ../bin/face_swap_sample
[ 87%] Linking CXX executable ../bin/firesmoke_detect_sample
[ 88%] Built target obstacle_detect_sample
[ 88%] Linking CXX executable ../bin/video_restoration_sample
[ 89%] Built target multi_detectors_sample
[ 90%] Built target face_swap_sample
[ 91%] Built target firesmoke_detect_sample
[ 92%] Linking CXX executable ../bin/app_des_sample
[ 93%] Linking CXX executable ../bin/app_src_des_sample
[ 94%] Linking CXX executable ../bin/lane_detect_sample
[ 95%] Built target video_restoration_sample
[ 96%] Linking CXX executable ../bin/frame_fusion_sample
[ 96%] Built target app_des_sample
[ 96%] Built target lane_detect_sample
[ 96%] Built target app_src_des_sample
[ 97%] Linking CXX executable ../bin/vp_test
[ 97%] Linking CXX executable ../bin/ffmpeg_src_des_sample
[ 97%] Linking CXX executable ../bin/ffmpeg_transcode_sample
[ 97%] Built target frame_fusion_sample
[ 98%] Built target vp_test
[ 99%] Built target ffmpeg_transcode_sample
[100%] Built target ffmpeg_src_des_sample
✅ 编译成功

=== 关键文件验证 ===
基础功能验证:
核心库文件验证:
  ✅ libvideo_pipe.so: 存在 (38096208 bytes)
  ✅ libtinyexpr.so: 存在 (40568 bytes)

基础 Samples 验证:1-1-1_sample: 存在
  ✅ face_tracking_sample: 存在

高级 Samples 检查(应不存在):
  ✅ vehicle_tracking_sample: 不存在(符合基础功能配置)
  ✅ trt_infer_sample: 不存在(符合基础功能配置)
  ✅ paddle_infer_sample: 不存在(符合基础功能配置)

✅ 基础功能验证通过:核心库和基础 samples 正常,无高级 samples

=== 编译结果统计 ===
生成的可执行文件:
bin/1-1-1_sample
bin/1-1-N_sample
bin/1-N-N_sample
bin/app_des_sample
bin/app_src_des_sample
bin/ba_crossline_sample
bin/enet_seg_sample
bin/face_swap_sample
bin/face_tracking_sample
bin/ffmpeg_src_des_sample
总数:32
生成的库文件:
./libs/libtinyexpr.so
./libs/libvideo_pipe.so
总数:2

构建目录: /share/code/videopipe/VideoPipe/build
功能配置: 基础功能(仅CPU模式,禁用高级示例)
构建时间: 20260203日 星期二 15:40:59 CST
构建完成

4.2.2 自定义功能编译选项

比如想编译自定义功能,如下:

./s5-compile.sh 
=== VideoPipe 智能编译配置脚本(带配置检测版)===
✓ 检测到 VideoPipe 子目录
工作目录: /share/code/videopipe/VideoPipe
=== 可用的编译选项 ===
根据 README.md,VideoPipe 支持以下选项:
-DVP_WITH_CUDA=ON          # CUDA 支持
-DVP_WITH_TRT=ON           # TensorRT 支持
-DVP_WITH_PADDLE=ON        # PaddlePaddle 支持
-DVP_WITH_KAFKA=ON         # Kafka 支持
-DVP_WITH_LLM=ON           # LLM 支持
-DVP_WITH_FFMPEG=ON        # FFMPEG 支持
-DVP_BUILD_COMPLEX_SAMPLES=ON  # 高级示例
请选择编译配置:
1) 完整功能(启用所有AI框架和高级示例)
2) 基础功能(仅CPU模式,禁用高级示例)
3) 自定义功能
请选择 (1/2/3): 3
选择:自定义功能配置
请逐个选择功能选项:
启用 FFMPEG 支持? (y/n) [默认y]: n
启用 CUDA 支持? (y/n) [默认n]: n
启用 TensorRT 支持? (y/n) [默认n]: n
启用 PaddlePaddle 支持? (y/n) [默认n]: n
启用 Kafka 支持? (y/n) [默认n]: n
启用 LLM 支持? (y/n) [默认n]: n
启用高级示例? (y/n) [默认n]: y
准备构建环境...

=== 配置变更检测 ===
检查配置兼容性...
1. 新配置 (CMAKE_OPTIONS):
    -D CMAKE_BUILD_TYPE=Release     -D CMAKE_CXX_STANDARD=17     -D CMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"     -D VP_WITH_OPENCV=ON     -D VP_WITH_GSTREAMER=ON -D VP_BUILD_COMPLEX_SAMPLES=ON

2. 提取的配置项:
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_CXX_STANDARD=17
-DCMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
-DVP_WITH_OPENCV=ON
-DVP_WITH_GSTREAMER=ON
-DVP_BUILD_COMPLEX_SAMPLES=ON

3. 当前缓存中的相关配置:
VP_BUILD_COMPLEX_SAMPLES:BOOL=OFF
VP_WITH_CUDA:BOOL=OFF
VP_WITH_FFMPEG:BOOL=ON
VP_WITH_GSTREAMER:UNINITIALIZED=ON
VP_WITH_KAFKA:BOOL=OFF
VP_WITH_LLM:BOOL=OFF
VP_WITH_OPENCV:UNINITIALIZED=ON
VP_WITH_PADDLE:BOOL=OFF
VP_WITH_TRT:BOOL=OFF

4. 关键配置对比:
  ❌ VP_BUILD_COMPLEX_SAMPLES: 冲突 (OFF → ON)
  ✅ VP_WITH_CUDA: 一致 (OFF)
  ✅ VP_WITH_TRT: 一致 (OFF)
  ✅ VP_WITH_PADDLE: 一致 (OFF)
  ✅ VP_WITH_KAFKA: 一致 (OFF)
  ✅ VP_WITH_LLM: 一致 (OFF)
  ❌ VP_WITH_FFMPEG: 冲突 (ON → OFF)

❌ 检测到 2 个配置冲突,清理缓存确保新配置生效...
✅ 缓存已清理

=== 最终配置摘要 ===
功能配置: 自定义功能

=== 实际使用的 CMake 宏定义 ===
完整的 CMake 选项字符串:
    -D CMAKE_BUILD_TYPE=Release     -D CMAKE_CXX_STANDARD=17     -D CMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"     -D VP_WITH_OPENCV=ON     -D VP_WITH_GSTREAMER=ON -D VP_BUILD_COMPLEX_SAMPLES=ON

解析后的宏定义列表:
-------------------
  __STDC_CONSTANT_MACROS
  __STDC_FORMAT_MACROS"
-------------------

配置 CMake...
-- The C compiler identification is GNU 13.3.0
-- The CXX compiler identification is GNU 13.3.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
-- Found OpenCV: /usr (found version "4.6.0") 
-- OpenCV library status:
--     version: 4.6.0
--     libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_alphamat;opencv_aruco;opencv_barcode;opencv_bgsegm;opencv_bioinspired;opencv_ccalib;opencv_cvv;opencv_datasets;opencv_dnn_objdetect;opencv_dnn_superres;opencv_dpm;opencv_face;opencv_freetype;opencv_fuzzy;opencv_hdf;opencv_hfs;opencv_img_hash;opencv_intensity_transform;opencv_line_descriptor;opencv_mcc;opencv_optflow;opencv_phase_unwrapping;opencv_plot;opencv_quality;opencv_rapid;opencv_reg;opencv_rgbd;opencv_saliency;opencv_shape;opencv_stereo;opencv_structured_light;opencv_superres;opencv_surface_matching;opencv_text;opencv_tracking;opencv_videostab;opencv_viz;opencv_wechat_qrcode;opencv_ximgproc;opencv_xobjdetect;opencv_xphoto
--     include path: /usr/include/opencv4
-- Found PkgConfig: /usr/bin/pkg-config (found version "1.8.1") 
-- Checking for module 'gstreamer-1.0'
--   Found gstreamer-1.0, version 1.24.2
-- Checking for module 'gstreamer-app-1.0'
--   Found gstreamer-app-1.0, version 1.24.2
-- Checking for module 'gstreamer-rtsp-server-1.0'
--   Found gstreamer-rtsp-server-1.0, version 1.24.2
-- GStreamer library status:
--     version: 1.24.2
--     libraries: gstreamer-1.0;gobject-2.0;glib-2.0 gstapp-1.0;gstbase-1.0;gstreamer-1.0;gobject-2.0;glib-2.0 gstrtspserver-1.0;gstreamer-1.0;gobject-2.0;glib-2.0
--     include path: /usr/include/gstreamer-1.0;/usr/include/glib-2.0;/usr/lib/x86_64-linux-gnu/glib-2.0/include;/usr/include;/usr/include/x86_64-linux-gnu
-------------start build tinyexpr--------------
--------------end build tinyexpr---------------
-------------collect version info--------------
fatal: detected dubious ownership in repository at '/mnt/hgfs/code/videopipe/VideoPipe'
To add an exception for this directory, call:

	git config --global --add safe.directory /mnt/hgfs/code/videopipe/VideoPipe
warning: 不是 git 仓库。使用 --no-index 比较工作区之外的两个路径
用法:git diff --no-index [<选项>] <路径> <路径>

差异输出格式化选项
    -p, --patch           生成补丁
    -s, --no-patch        不显示差异输出
    -u                    生成补丁
    -U, --unified[=<n>]   生成含 <n> 行上下文的差异
    -W, --[no-]function-context
                          生成含 <n> 行上下文的差异
    --raw                 生成原始格式的差异
    --patch-with-raw      和 '-p --raw' 同义
    --patch-with-stat     和 '-p --stat' 同义
    --numstat             机器友好的 --stat
    --shortstat           只输出 --stat 的最后一行
    -X, --dirstat[=<参数1,参数2>...]
                          输出每个子目录相对变更的分布
    --cumulative          和 --dirstat=cumulative 同义
    --dirstat-by-file[=<参数1,参数2>...]--dirstat=files,param1,param2... 的同义词
    --check               如果变更中引入冲突定界符或空白错误,给出警告
    --summary             精简摘要,例如创建、重命名和模式变更
    --name-only           只显示变更文件的文件名
    --name-status         只显示变更文件的文件名和状态
    --stat[=<宽度>[,<文件名宽度>[,<次数>]]]
                          生成差异统计(diffstat)
    --stat-width <宽度>   使用给定的长度生成差异统计
    --stat-name-width <宽度>
                          使用给定的文件名长度生成差异统计
    --stat-graph-width <宽度>
                          使用给定的图形长度生成差异统计
    --stat-count <次数>   生成有限行数的差异统计
    --[no-]compact-summary
                          生成差异统计的简洁摘要
    --binary              输出一个可以应用的二进制差异
    --[no-]full-index     在 "index" 行显示完整的前后对象名称
    --[no-]color[=<何时>] 显示带颜色的差异
    --ws-error-highlight <类型>
                          对于差异中的上下文、旧的和新的行,加亮显示错误的空白字符
    -z                    在 --raw 或者 --numstat 中,不对路径字符转码并使用 NUL 字符做为输出字段的分隔符
    --[no-]abbrev[=<n>]<n> 位数字显示对象名
    --src-prefix <前缀>   显示给定的源前缀取代 "a/"
    --dst-prefix <前缀>   显示给定的目标前缀取代 "b/"
    --line-prefix <前缀>  输出的每一行附加前缀
    --no-prefix           不显示任何源和目标前缀
    --default-prefix      use default prefixes a/ and b/
    --inter-hunk-context <n>
                          显示指定行数的差异块间的上下文
    --output-indicator-new <字符>
                          指定一个字符取代 '+' 来表示新的一行
    --output-indicator-old <字符>
                          指定一个字符取代 '-' 来表示旧的一行
    --output-indicator-context <字符>
                          指定一个字符取代 ' ' 来表示一行上下文

差异重命名选项
    -B, --break-rewrites[=<n>[/<m>]]
                          将完全重写的变更打破为成对的删除和创建
    -M, --find-renames[=<n>]
                          检测重命名
    -D, --irreversible-delete
                          省略删除操作的差异输出
    -C, --find-copies[=<n>]
                          检测拷贝
    --[no-]find-copies-harder
                          使用未修改的文件做为发现拷贝的源
    --no-renames          禁用重命名探测
    --[no-]rename-empty   使用空的数据对象做为重命名的源
    --[no-]follow         继续列出文件重命名以外的历史记录
    -l <n>                如果重命名/拷贝目标超过给定的限制,禁止重命名/拷贝检测

差异算法选项
    --minimal             生成尽可能小的差异
    -w, --ignore-all-space
                          行比较时忽略空白字符
    -b, --ignore-space-change
                          忽略空白字符的变更
    --ignore-space-at-eol 忽略行尾的空白字符变更
    --ignore-cr-at-eol    忽略行尾的回车符(CR)
    --ignore-blank-lines  忽略整行都是空白的变更
    -I, --[no-]ignore-matching-lines <正则>
                          忽略所有行都和正则表达式匹配的变更
    --[no-]indent-heuristic
                          启发式转换差异边界以便阅读
    --patience            使用 "patience diff" 算法生成差异
    --histogram           使用 "histogram diff" 算法生成差异
    --diff-algorithm <算法>
                          选择一个差异算法
    --anchored <文本>     使用 "anchored diff" 算法生成差异
    --word-diff[=<模式>]  显示单词差异,使用 <模式> 分隔变更的单词
    --word-diff-regex <正则>
                          使用 <正则表达式> 确定何为一个词
    --color-words[=<正则>]
                          相当于 --word-diff=color --word-diff-regex=<正则>
    --[no-]color-moved[=<模式>]
                          移动的代码行用不同方式着色
    --[no-]color-moved-ws <模式>--color-moved 下如何忽略空白字符

其它差异选项
    --[no-]relative[=<前缀>]
                          当从子目录运行,排除目录之外的变更并显示相对路径
    -a, --[no-]text       把所有文件当做文本处理
    -R                    交换两个输入,反转差异
    --[no-]exit-code      有差异时退出码为 1,否则为 0
    --[no-]quiet          禁用本程序的所有输出
    --[no-]ext-diff       允许执行一个外置的差异助手
    --[no-]textconv       当比较二进制文件时,运行外部的文本转换过滤器
    --ignore-submodules[=<何时>]
                          在生成差异时,忽略子模组的更改
    --submodule[=<格式>]  指定子模组的差异如何显示
    --ita-invisible-in-index
                          隐藏索引中 'git add -N' 条目
    --ita-visible-in-index
                          将索引中 'git add -N' 条目当做真实的
    -S <字符串>           查找改变了指定字符串出现次数的差异
    -G <正则>             查找改变指定正则匹配出现次数的差异
    --pickaxe-all         显示使用 -S 或 -G 的变更集的所有变更
    --pickaxe-regex       将 -S 的 <string> 当做扩展的 POSIX 正则表达式
    -O <文件>             控制输出中的文件显示顺序
    --rotate-to <路径>    先显示指定路径的变更
    --skip-to <路径>      跳过指定路径的输出
    --find-object <对象 ID>
                          查找改变指定对象出现次数的差异
    --diff-filter [(A|C|D|M|R|T|U|X|B)...[*]]
                          通过差异类型选择文件
    --output <文件>       输出到指定的文件

-- version info:
--     build_time: 20260203-154311
--     commit_hash: -dirty
-------------collect version info--------------
start build for simple samples...
start build for complex sampels...
-- Configuring done (1.7s)
CMake Error at samples/CMakeLists.txt:203 (add_executable):
  Cannot find source file:

    face_recognize/face_recognize_pipeline.cpp

  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm
  .ccm .cxxm .c++m .h .hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90
  .f95 .f03 .hip .ispc


CMake Error at samples/CMakeLists.txt:203 (add_executable):
  No SOURCES given to target: face_recognize_pipeline


CMake Generate step failed.  Build files cannot be regenerated correctly.
✗ CMake 配置失败

开启高级示例会报错,是因为当前版本的videopipe把高级示例给删除了,可以通过git log查找回来。

4.2.3 全功能编译选项

还有全功能开启如下:

./s5-compile.sh 
=== VideoPipe 智能编译配置脚本(带配置检测版)===
✓ 检测到 VideoPipe 子目录
工作目录: /share/code/videopipe/VideoPipe
=== 可用的编译选项 ===
根据 README.md,VideoPipe 支持以下选项:
-DVP_WITH_CUDA=ON          # CUDA 支持
-DVP_WITH_TRT=ON           # TensorRT 支持
-DVP_WITH_PADDLE=ON        # PaddlePaddle 支持
-DVP_WITH_KAFKA=ON         # Kafka 支持
-DVP_WITH_LLM=ON           # LLM 支持
-DVP_WITH_FFMPEG=ON        # FFMPEG 支持
-DVP_BUILD_COMPLEX_SAMPLES=ON  # 高级示例
请选择编译配置:
1) 完整功能(启用所有AI框架和高级示例)
2) 基础功能(仅CPU模式,禁用高级示例)
3) 自定义功能
请选择 (1/2/3): 1
选择:完整功能配置
准备构建环境...

=== 配置变更检测 ===
检查配置兼容性...
1. 新配置 (CMAKE_OPTIONS):
    -D CMAKE_BUILD_TYPE=Release     -D CMAKE_CXX_STANDARD=17     -D CMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"     -D VP_WITH_OPENCV=ON     -D VP_WITH_GSTREAMER=ON             -D VP_WITH_FFMPEG=ON             -D VP_WITH_CUDA=ON             -D VP_WITH_TRT=ON             -D VP_WITH_PADDLE=ON             -D VP_WITH_KAFKA=ON             -D VP_WITH_LLM=ON             -D VP_BUILD_COMPLEX_SAMPLES=ON

2. 提取的配置项:
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_CXX_STANDARD=17
-DCMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
-DVP_WITH_OPENCV=ON
-DVP_WITH_GSTREAMER=ON
-DVP_WITH_FFMPEG=ON
-DVP_WITH_CUDA=ON
-DVP_WITH_TRT=ON
-DVP_WITH_PADDLE=ON
-DVP_WITH_KAFKA=ON
-DVP_WITH_LLM=ON
-DVP_BUILD_COMPLEX_SAMPLES=ON

3. 当前缓存中的相关配置:
VP_BUILD_COMPLEX_SAMPLES:BOOL=ON
VP_WITH_CUDA:BOOL=OFF
VP_WITH_FFMPEG:BOOL=OFF
VP_WITH_GSTREAMER:UNINITIALIZED=ON
VP_WITH_KAFKA:BOOL=OFF
VP_WITH_LLM:BOOL=OFF
VP_WITH_OPENCV:UNINITIALIZED=ON
VP_WITH_PADDLE:BOOL=OFF
VP_WITH_TRT:BOOL=OFF

4. 关键配置对比:
  ✅ VP_BUILD_COMPLEX_SAMPLES: 一致 (ON)
  ❌ VP_WITH_CUDA: 冲突 (OFF → ON)
  ❌ VP_WITH_TRT: 冲突 (OFF → ON)
  ❌ VP_WITH_PADDLE: 冲突 (OFF → ON)
  ❌ VP_WITH_KAFKA: 冲突 (OFF → ON)
  ❌ VP_WITH_LLM: 冲突 (OFF → ON)
  ❌ VP_WITH_FFMPEG: 冲突 (OFF → ON)

❌ 检测到 6 个配置冲突,清理缓存确保新配置生效...
✅ 缓存已清理

=== 最终配置摘要 ===
功能配置: 完整功能(所有AI框架,启用高级示例)

=== 实际使用的 CMake 宏定义 ===
完整的 CMake 选项字符串:
    -D CMAKE_BUILD_TYPE=Release     -D CMAKE_CXX_STANDARD=17     -D CMAKE_CXX_FLAGS="-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"     -D VP_WITH_OPENCV=ON     -D VP_WITH_GSTREAMER=ON             -D VP_WITH_FFMPEG=ON             -D VP_WITH_CUDA=ON             -D VP_WITH_TRT=ON             -D VP_WITH_PADDLE=ON             -D VP_WITH_KAFKA=ON             -D VP_WITH_LLM=ON             -D VP_BUILD_COMPLEX_SAMPLES=ON

解析后的宏定义列表:
-------------------
  __STDC_CONSTANT_MACROS
  __STDC_FORMAT_MACROS"
-------------------

配置 CMake...
-- The C compiler identification is GNU 13.3.0
-- The CXX compiler identification is GNU 13.3.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
-- Found OpenCV: /usr (found version "4.6.0") 
-- OpenCV library status:
--     version: 4.6.0
--     libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_alphamat;opencv_aruco;opencv_barcode;opencv_bgsegm;opencv_bioinspired;opencv_ccalib;opencv_cvv;opencv_datasets;opencv_dnn_objdetect;opencv_dnn_superres;opencv_dpm;opencv_face;opencv_freetype;opencv_fuzzy;opencv_hdf;opencv_hfs;opencv_img_hash;opencv_intensity_transform;opencv_line_descriptor;opencv_mcc;opencv_optflow;opencv_phase_unwrapping;opencv_plot;opencv_quality;opencv_rapid;opencv_reg;opencv_rgbd;opencv_saliency;opencv_shape;opencv_stereo;opencv_structured_light;opencv_superres;opencv_surface_matching;opencv_text;opencv_tracking;opencv_videostab;opencv_viz;opencv_wechat_qrcode;opencv_ximgproc;opencv_xobjdetect;opencv_xphoto
--     include path: /usr/include/opencv4
-- Found PkgConfig: /usr/bin/pkg-config (found version "1.8.1") 
-- Checking for module 'gstreamer-1.0'
--   Found gstreamer-1.0, version 1.24.2
-- Checking for module 'gstreamer-app-1.0'
--   Found gstreamer-app-1.0, version 1.24.2
-- Checking for module 'gstreamer-rtsp-server-1.0'
--   Found gstreamer-rtsp-server-1.0, version 1.24.2
-- GStreamer library status:
--     version: 1.24.2
--     libraries: gstreamer-1.0;gobject-2.0;glib-2.0 gstapp-1.0;gstbase-1.0;gstreamer-1.0;gobject-2.0;glib-2.0 gstrtspserver-1.0;gstreamer-1.0;gobject-2.0;glib-2.0
--     include path: /usr/include/gstreamer-1.0;/usr/include/glib-2.0;/usr/lib/x86_64-linux-gnu/glib-2.0/include;/usr/include;/usr/include/x86_64-linux-gnu
-------------start build trt_vehicle--------------
CMake Warning (dev) at third_party/trt_vehicle/CMakeLists.txt:21 (find_package):
  Policy CMP0146 is not set: The FindCUDA module is removed.  Run "cmake
  --help-policy CMP0146" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Error at /usr/share/cmake-3.28/Modules/FindCUDA.cmake:883 (message):
  Specify CUDA_TOOLKIT_ROOT_DIR
Call Stack (most recent call first):
  third_party/trt_vehicle/CMakeLists.txt:21 (find_package)


-- Configuring incomplete, errors occurred!
✗ CMake 配置失败

完整功能是开启所有AI,目前缺少对应库支持,所以也是报错。
这些后续再说,采用基本功能看下其原理暂时够用了。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐