CMakeLists 写法总结3.0

目录

[1. bash脚本](#1. bash脚本)

[2. cmakelists](#2. cmakelists)

之前的两篇,主要是在讲cmakelists怎么写。到实际工程中再进一步,通常是bash脚本+cmakelists同时使用的。有些变量既可以定义在bash脚本里,也可以定义在cmakelists里,甚至有些可以写在docker环境里(如果构建docker的时候写进去的话)。

下面提供一个我实际在用的bash脚本和cmakelists

1. bash脚本

bash脚本

bash 复制代码
#!/bin/bash

set -e

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

# 显示用法信息
usage() {
    echo "用法: $0 [目标]"
    echo "目标:"
    echo "  g2             构建g2版本 (使用OpenCV4)"
    echo "  x5             构建x5版本 (使用OpenCV3)" 
    echo "  x86            构建x86版本 (使用OpenCV3)"
    echo "  clean          清理所有构建目录"
    echo ""
    echo "示例:"
    echo "  $0 g2           # 构建g2版本"
    echo "  $0 x5           # 构建x5版本"
    echo "  $0 clean        # 清理所有构建目录"
}

# 如果没有参数,显示用法并退出
if [ $# -eq 0 ]; then
    usage
    exit 1
fi

# 处理参数
case $1 in
    g2|x5|x86)
        TARGET="$1"
        ;;
    clean)
        echo "清理所有构建目录..."
        rm -rf "${SCRIPT_DIR}/arm_build" "${SCRIPT_DIR}/x86_build"
        echo "清理完成"
        exit 0
        ;;
    -h|--help|help)
        usage
        exit 0
        ;;
    *)
        echo "错误: 未知目标 '$1'"
        usage
        exit 1
        ;;
esac

# GCC版本检查函数 (用于x86构建)
check_gcc() {
    export compiler=$(which gcc)
    MAJOR=$(echo __GNUC__ | $compiler -E -xc - | tail -n 1)
    MINOR=$(echo __GNUC_MINOR__ | $compiler -E -xc - | tail -n 1)
    PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -xc - | tail -n 1)
    gcc_version=${MAJOR}.${MINOR}.${PATCHLEVEL}
    if ((${MAJOR} < 5)) || ((${MAJOR} == 5 && ${MINOR} < 4)) || ((${MAJOR} == 5 && ${MINOR} == 4 && ${PATCHLEVEL} < 0)); then
        echo "您的gcc版本是 ${gcc_version}"
        echo "x86 GCC版本应该 >= 5.4.0,请解压 ddk/package/host/gcc-5.4.0.tar.gz 安装后重新执行。"
        exit 1
    else
        echo "GCC版本检查成功。GCC版本是 ${gcc_version}。"
    fi
}

# 根据目标执行相应的构建
case $TARGET in
    g2)
        echo "开始构建 g2 版本 (OpenCV4)..."
        
        # TOOL_CHAIN="${SCRIPT_DIR}/toolchainfile.cmake"
        # echo "toolchain is ${TOOL_CHAIN}"
        # ROS_DIR="${SCRIPT_DIR}/tools/ros/install/root/opt/ros/noetic"
        
        # 构建
        rm -rf "${SCRIPT_DIR}/arm_build"
        mkdir "${SCRIPT_DIR}/arm_build"
        cd "${SCRIPT_DIR}/arm_build"
        
        platform="x5"
        build_type="release"
        cmake .. \
            -Dbuild_type=${build_type} \
            -DPLATFORM=${platform} \
            -DUSE_ROS=true \
            -DIS_LOG_INFO=true \
            -DUSE_OPENCV4=true
            # -DCMAKE_PREFIX_PATH=${ROS_DIR} \
        make -j8
        make install
        
        cd "${SCRIPT_DIR}"
        rm -rf "${SCRIPT_DIR}/arm_build"
        ;;
        
    x5)
        echo "开始构建 x5 版本 (OpenCV3)..."
        
        if [ ${LINARO_GCC_ROOT} ]; then
            GCC_ROOT=${LINARO_GCC_ROOT}
        else
            GCC_ROOT="/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/"
        fi
        export CC=${GCC_ROOT}/bin/aarch64-none-linux-gnu-gcc
        export CXX=${GCC_ROOT}/bin/aarch64-none-linux-gnu-g++
        
        rm -rf "${SCRIPT_DIR}/arm_build"
        mkdir "${SCRIPT_DIR}/arm_build"
        cd "${SCRIPT_DIR}/arm_build"
        
        build_type="release"
        gcc_version="11.2"
        if [[ ${GCC_ROOT} == *11.2* ]]; then
            gcc_version="11.2"
        fi
        
        cmake -Dbuild_type=${build_type} -DPLATFORM=x5 "${SCRIPT_DIR}" -Dgcc_version=${gcc_version} -DUSE_ROS=false -DIS_LOG_INFO=false -DUSE_OPENCV4=false
        
        make -j8
        make install
        
        cd "${SCRIPT_DIR}"
        rm -rf "${SCRIPT_DIR}/arm_build"
        ;;
        
    x86)
        echo "开始构建 x86 版本 (OpenCV3)..."
        
        cd "${SCRIPT_DIR}" || exit 1
        
        # 执行gcc版本检查
        check_gcc
        deps_version="11.2"
        platform="x86"
        
        rm -rf "${SCRIPT_DIR}/x86_build"
        mkdir "${SCRIPT_DIR}/x86_build"
        
        cd "${SCRIPT_DIR}/x86_build"
        build_type="Release"
        
        cmake -DCMAKE_BUILD_TYPE=${build_type} -DPLATFORM=${platform} "${SCRIPT_DIR}" -Ddeps_version=${deps_version} -DUSE_ROS=false -DUSE_OPENCV4=false
        
        make -j8
        make install
        
        cd "${SCRIPT_DIR}"
        rm -rf "${SCRIPT_DIR}/x86_build"
        ;;
esac

echo "构建完成: $TARGET"

这里面需要注意的是,利用bash脚本,可以将逐步make的过程写进脚本里,方便一键完成编译。涉及到的几个关键命令如下:

bash 复制代码
cmake -Dbuild_type=${build_type} -DPLATFORM=x5 "${SCRIPT_DIR}" -Dgcc_version=${gcc_version} -DUSE_ROS=false -DIS_LOG_INFO=false -DUSE_OPENCV4=false
        
make -j8 # 编译源代码
make install # 安装到系统目录

cmake 用来指定编译选项,通过 -D 定义或覆盖任何变量 ,该变量会成为 CMake 缓存变量,CMakeLists.txt 中可以通过 $变量名 读取。注意这里定义的变量优先级更高,会覆盖CMakelists里的变量

make就是用来编译源代码的命令,-j8表示最多允许同时执行8个任务。

make install 将编译完成的结果,如库文件,可执行文件等,安装到系统文件夹,可以安装到指定的文件,比如指定

bash 复制代码
./configure --prefix=/your/custom/path

也可以在make install后面添加,覆盖系统路径

bash 复制代码
make install prefix=/your/custom/path

如果项目使用 CMake,安装路径通过 CMAKE_INSTALL_PREFIX 指定

bash 复制代码
cmake -B build -DCMAKE_INSTALL_PREFIX=/your/custom/path

2. cmakelists

最后附上一个我在用的一个工程的cmakelists,挑几个比较重要的说一下。

首先是可以定义一些变量的,在方便路径定义等的时候很有用,比如可以指定一个编译工具的路径,像ros啊等等。另外结合docker环境,可以把一些东西直接安装在docker环境里,比如我一开始敌营TOOLS_ROOT,就是把之前放在本地的一些包丢进docker的固定目录里,然后在cmakelists里定义清楚就行。具体如下:

bash 复制代码
# 添加 TOOLS_ROOT 定义
if(DEFINED ENV{TOOLS_ROOT})
    set(TOOLS_ROOT $ENV{TOOLS_ROOT})
    message(STATUS "Using TOOLS_ROOT from environment: ${TOOLS_ROOT}")
else()
    # 如果未设置环境变量,尝试使用 /opt/tools(Docker 中的默认路径)
    if(EXISTS "/opt/tools")
        set(TOOLS_ROOT "/opt/tools")
        message(STATUS "Using default TOOLS_ROOT: ${TOOLS_ROOT}")
    else()
        # 回退到原来的相对路径(兼容本地开发)
        set(TOOLS_ROOT "${CMAKE_SOURCE_DIR}/tools")
        message(STATUS "TOOLS_ROOT not found, using relative path: ${TOOLS_ROOT}")
    endif()
endif()

但是仍然要注意的是,如果一些变量在Cmake后面定义过了,就会被覆盖。

附上在用的一个cmakelists

bash 复制代码
cmake_minimum_required(VERSION 2.8)

# 添加 TOOLS_ROOT 定义
if(DEFINED ENV{TOOLS_ROOT})
    set(TOOLS_ROOT $ENV{TOOLS_ROOT})
    message(STATUS "Using TOOLS_ROOT from environment: ${TOOLS_ROOT}")
else()
    # 如果未设置环境变量,尝试使用 /opt/tools(Docker 中的默认路径)
    if(EXISTS "/opt/tools")
        set(TOOLS_ROOT "/opt/tools")
        message(STATUS "Using default TOOLS_ROOT: ${TOOLS_ROOT}")
    else()
        # 回退到原来的相对路径(兼容本地开发)
        set(TOOLS_ROOT "${CMAKE_SOURCE_DIR}/tools")
        message(STATUS "TOOLS_ROOT not found, using relative path: ${TOOLS_ROOT}")
    endif()
endif()

SET(PROJECT_ROOT_DIR ${CMAKE_SOURCE_DIR})
message(STATUS "Project root directory: ${PROJECT_ROOT_DIR}")


SET(PROJECT_ROOT_DIR ${CMAKE_SOURCE_DIR})
message(STATUS "Project root directory: ${PROJECT_ROOT_DIR}")
# 交叉编译配置 - 只在 g2 平台 (USE_OPENCV4 + x5) 时启用
if(USE_OPENCV4 AND PLATFORM STREQUAL "x5")
    message("===> Configuring for cross-compilation (g2 platform)")
    
    SET(CMAKE_SYSTEM_NAME Linux)
    SET(CMAKE_SYSTEM_PROCESSOR aarch64)

    # set(PROJECT_ROOT_DIR ${CMAKE_SOURCE_DIR})
    # SET(BUILD_ROOT "${TOOLS_ROOT}")
    SET(TOOLCHAIN_DIR "${TOOLS_ROOT}/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu")
    SET(ROS_ROOT "${TOOLS_ROOT}/ros/install/root")
    SET(SYS_ROOT "${TOOLS_ROOT}/root")
    SET(OpenCV_DIR "${TOOLS_ROOT}/opencv/install/root/usr/lib/cmake/opencv4")
    SET(BULLET_ROOT ${SYS_ROOT}/usr)
    SET(SDL_INCLUDE_DIR ${SYS_ROOT}/usr/include)
    SET(SDL_LIBRARY ${SYS_ROOT}/usr)
    SET(SDL_IMAGE_INCLUDE_DIR ${SYS_ROOT}/usr/include)
    SET(SDL_IMAGE_LIBRARIES ${SYS_ROOT}/usr)
    SET(yaml-cpp_DIR "${SYS_ROOT}/usr/lib/aarch64-linux-gnu/cmake/yaml-cpp")
    SET(PYTHON_INCLUDE_DIR "${SYS_ROOT}/usr/include/python3.10")
    SET(PYTHON_LIBRARY "${SYS_ROOT}/usr/lib")

    SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-gcc CACHE FILEPATH "Archiver")
    SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-g++ CACHE FILEPATH "Archiver")
    SET(CMAKE_AR ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-ar CACHE FILEPATH "Archiver")
    SET(CMAKE_AS ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-as CACHE FILEPATH "Archiver")
    SET(CMAKE_LD  ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-ld CACHE FILEPATH "Archiver")
    SET(CMAKE_NM ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-nm CACHE FILEPATH "Archiver")
    SET(CMAKE_STRIP ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-strip CACHE FILEPATH "Archiver")

    set(CMAKE_C_FLAGS "-Wl,-rpath-link,${SYS_ROOT}/usr/lib/aarch64-linux-gnu -Wl,-rpath-link,${ROS_ROOT}/opt/ros/noetic/lib" CACHE STRING "Buildroot CFLAGS")
    set(CMAKE_CXX_FLAGS "-std=c++14 -Wl,-rpath-link,${SYS_ROOT}/usr/lib/aarch64-linux-gnu -Wl,-rpath-link,${ROS_ROOT}/opt/ros/noetic/lib" CACHE STRING "Buildroot CXXFLAGS")

    SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/aarch64-none-linux-gnu/libc ${ROS_ROOT}/opt/ros/noetic ${SYS_ROOT})

    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
else()
    if(PLATFORM STREQUAL "x5")
        # x5 平台的交叉编译设置
        if(USE_OPENCV4)
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
        else()
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
        endif()
    else()
        # x86 平台
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    endif()
endif()

project(dnn_tutorial)

# 检测OpenCV版本并设置相关变量
if(USE_OPENCV4)
    message("===> Using OpenCV 4")
    find_package(Python3 REQUIRED)
    set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
    
    # OpenCV4配置
    SET(OpenCV_INCLUDE_DIRS "${TOOLS_ROOT}/opencv/install/root/usr/include/opencv4")
    link_directories(${TOOLS_ROOT}/opencv/install/root/usr/lib)
    SET(OpenCV_LIBS opencv_core opencv_imgproc opencv_imgcodecs opencv_calib3d 
                    opencv_highgui opencv_flann opencv_features2d opencv_video opencv_videoio)
    include_directories(${OpenCV_INCLUDE_DIRS})
    message("OpenCV_INCLUDE_DIRS: " ${OpenCV_INCLUDE_DIRS})
    message("OpenCV_LIBS: " ${OpenCV_LIBS})
else()
    message("===> Using OpenCV 3")
    # OpenCV3配置 - 修改这里
    if(${PLATFORM} STREQUAL "x5")
        set(DEPS_ROOT "${TOOLS_ROOT}/deps/deps_gcc11.2/aarch64")
    else()
        set(DEPS_ROOT "${TOOLS_ROOT}/deps/deps_gcc11.2/x86")
    endif()
    
    # 添加OpenCV头文件路径
    include_directories(${DEPS_ROOT}/opencv/include)
    link_directories(${DEPS_ROOT}/opencv/lib)
endif()

# libdnn.so depends on system software dynamic link library, use -Wl,-unresolved-symbols=ignore-in-shared-libs to shield during compilation
# 在共享库中忽略未解析的符号(即声明了但找不到定义的函数或者变量------运行时动态解析)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-unresolved-symbols=ignore-in-shared-libs")

# 设置编译选项
if(USE_OPENCV4)
    set(CMAKE_CXX_FLAGS_RELEASE " -O3 ")
    set(CMAKE_C_FLAGS_RELEASE " -O3 ")
else()
    set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
    set(CMAKE_C_FLAGS_DEBUG "-g -O0")
    set(CMAKE_CXX_FLAGS_RELEASE " -O3")
    set(CMAKE_C_FLAGS_RELEASE " -O3")
endif()

set(CMAKE_BUILD_TYPE ${build_type})

message("===> PLATFORM is ${PLATFORM}")

# EVALU_MODEL_INFERENCE_TIME, 评估模型推理时间
option(EVALU_MODEL_INFERENCE_TIME "evalute model inference time" OFF)
message("EVALU_MODEL_INFERENCE_TIME is ${EVALU_MODEL_INFERENCE_TIME}")
if (EVALU_MODEL_INFERENCE_TIME)
  add_definitions(-DEVALU_MODEL_INFERENCE_TIME)
endif()

# USE_ROS
option(USE_ROS "use ros" ON)
message("USE_ROS is ${USE_ROS}")
if (USE_ROS)
  add_definitions(-DUSE_ROS)
  find_package(catkin REQUIRED COMPONENTS
        std_msgs
        roscpp
        )
endif()

# LOG_INFO option, under x86 should be OFF
option(IS_LOG_INFO "is log info" OFF)
message("IS_LOG_INFO is ${IS_LOG_INFO}")
if (IS_LOG_INFO)
  add_definitions(-DIS_LOG_INFO)
endif()

# encryption option
option(IS_ENCRYPTION_MODEL "is encryption model" ON)
message("IS_ENCRYPTION_MODEL is ${IS_ENCRYPTION_MODEL}")
if (IS_ENCRYPTION_MODEL)
  add_definitions(-DIS_ENCRYPTION_MODEL)
endif()

# 设置平台相关变量
if (${PLATFORM} STREQUAL "x5")
    set(PLATFORM_DIR "aarch64")
    set(DEPS_ROOT "${TOOLS_ROOT}/deps/deps_gcc11.2/aarch64")
    set(RAIPJSON_ROOT "${TOOLS_ROOT}/deps/deps_gcc11.2/aarch64")
    set(HOST_PACKAGE_DIR $ENV{HORIZON_LIB_PATH}/ddk/x5_aarch64)
    set(DNN_DIR ${HOST_PACKAGE_DIR}/dnn)
else() # x86
    set(PLATFORM_DIR "x86")
    set(DEPS_ROOT "${TOOLS_ROOT}/deps/deps_gcc11.2/x86")
    set(RAIPJSON_ROOT "${TOOLS_ROOT}/deps/deps_gcc11.2/aarch64")
    set(HOST_PACKAGE_DIR "${TOOLS_ROOT}/deps/deps_gcc11.2/x86")
    set(DNN_DIR ${HOST_PACKAGE_DIR}/dnn_x86)
endif()

message("===> gcc_version is: ${gcc_version}")
message(STATUS "Install directory: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message("===> HOST_PACKAGE_DIR: ${HOST_PACKAGE_DIR}")

# 添加头文件目录和链接库目录
include_directories(
    ${DNN_DIR}/include
    ${DEPS_ROOT}/glog/include
    ${DEPS_ROOT}/gflags/include
    ${RAIPJSON_ROOT}/rapidjson
    ${PROJECT_SOURCE_DIR}/src/ecoencrypt
    ${TOOLS_ROOT}/deps/nlohmann_include/include)

link_directories(
    ${DNN_DIR}/lib
    ${DEPS_ROOT}/glog/lib
    ${DEPS_ROOT}/gflags/lib)

# 对于OpenCV3,需要添加OpenCV的链接目录
if(NOT USE_OPENCV4)
    link_directories(${DEPS_ROOT}/opencv/lib)
endif()

# 检查关键库目录是否存在
foreach(lib_dir 
    ${DNN_DIR}/lib
    ${DEPS_ROOT}/glog/lib
    ${DEPS_ROOT}/gflags/lib)
    if(NOT EXISTS ${lib_dir})
        message(WARNING "Library directory does not exist: ${lib_dir}")
    endif()
endforeach()

if (USE_ROS)  
    include_directories(${catkin_INCLUDE_DIRS})
endif()

# 设置链接库
if (${PLATFORM} STREQUAL "x5")
    if(USE_OPENCV4)
        SET(LINK_libs dnn gflags glog dl rt pthread)
    else()
        SET(LINK_libs dnn gflags glog opencv_world dl rt pthread)
    endif()
else()
    SET(LINK_libs dnn hbdk_sim_x86 gflags glog opencv_world dl rt pthread)
endif()

# libecoaigrass库配置
include_directories(
    ${PROJECT_SOURCE_DIR}/src  
    ${PROJECT_SOURCE_DIR}/src/algorithm
    ${PROJECT_SOURCE_DIR}/src/utils
    ${PROJECT_SOURCE_DIR}/src/basicModel
    ${PROJECT_SOURCE_DIR}/src/gecaojiObjectDetect
    ${PROJECT_SOURCE_DIR}/src/cnnWaterDetect
    ${PROJECT_SOURCE_DIR}/src/cnnGrassDetect
    ${PROJECT_SOURCE_DIR}/src/GrassTofWaterDetect)

# 添加多个源文件
aux_source_directory(${PROJECT_SOURCE_DIR}/src/ecoencrypt DIR_ssl_SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/utils DIR_utils_SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/algorithm DIR_al_SRC)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/basicModel DIR_basic_SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/gecaojiObjectDetect DIR_PetsDetection_SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/cnnWaterDetect DIR_cnnWaterDetect_SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/cnnGrassDetect DIR_cnnGrassDetect_SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/GrassTofWaterDetect DIR_GrassTofWaterDetect_SRCS)

# 创建共享库
ADD_LIBRARY(ecoaigrassseg SHARED 
    ${DIR_utils_SRCS} 
    ${DIR_al_SRC} 
    ${DIR_basic_SRCS}
    ${DIR_ssl_SRCS}
    ${DIR_PetsDetection_SRCS}
    ${DIR_GrassTofWaterDetect_SRCS}
    ${DIR_cnnWaterDetect_SRCS}
    ${DIR_cnnGrassDetect_SRCS}
)

find_package(Threads)

# 设置日志库
if(${PLATFORM} STREQUAL "x5")
    set(ECO_LOG_LIB "${TOOLS_ROOT}/deps/libecolog.so")
endif()

# 链接库
if (USE_ROS)  
    if(USE_OPENCV4)
        target_link_libraries(ecoaigrassseg
            ${LINK_libs}
            ${OpenCV_LIBS}
            ${CMAKE_THREAD_LIBS_INIT}
            ${catkin_LIBRARIES}
            ${ECO_LOG_LIB}
        )
    else()
        target_link_libraries(ecoaigrassseg
            ${LINK_libs}
            ${CMAKE_THREAD_LIBS_INIT}
            ${catkin_LIBRARIES}
            # ${ECO_LOG_LIB}
        )
    endif()
else()
    if(USE_OPENCV4)
        target_link_libraries(ecoaigrassseg
            ${LINK_libs}
            ${OpenCV_LIBS}
            ${CMAKE_THREAD_LIBS_INIT}
            ${ECO_LOG_LIB}
        )
    else()
        target_link_libraries(ecoaigrassseg
            ${LINK_libs}
            ${CMAKE_THREAD_LIBS_INIT}
            # ${ECO_LOG_LIB}
        )
    endif()
endif()

# 可执行文件配置
add_executable(main_detect_symbol_hysym main_detect_symbol_hysym.cpp)
target_link_libraries(main_detect_symbol_hysym
    ${LINK_libs}
    ecoaigrassseg
    ${CMAKE_THREAD_LIBS_INIT}
    -ldl
)

add_executable(main_detect_simple main_detect_simple.cpp)
target_link_libraries(main_detect_simple
    ${LINK_libs}
    ecoaigrassseg
    ${CMAKE_THREAD_LIBS_INIT}
    -ldl
)

# 安装配置
if(USE_OPENCV4)
    set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/${PLATFORM}_opencv4)
    
    # install(TARGETS main_detect_symbol DESTINATION ./)
    install(TARGETS main_detect_symbol_hysym DESTINATION ./)
else()
    set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/${PLATFORM}_opencv3)
    
    # install(TARGETS main_detect_symbol DESTINATION ./)
    # install(TARGETS main_tof_detect DESTINATION ./)
    # install(TARGETS yuv_detect DESTINATION ./)
    # install(TARGETS main_detect_symbol_images DESTINATION ./)
    install(TARGETS main_detect_symbol_hysym DESTINATION ./)
    install(TARGETS main_detect_simple DESTINATION ./)
endif()

install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libecoaigrassseg.so DESTINATION lib)
install(DIRECTORY config DESTINATION ./)
# install(FILES run_rknn3588.sh DESTINATION ./)

# 安装OpenCV库
if(NOT USE_OPENCV4)
    install(PROGRAMS ${DEPS_ROOT}/opencv/lib/libopencv_world.so.3.4 DESTINATION lib)
endif()

# 安装平台相关库
if (${PLATFORM} STREQUAL "x5")
    install(PROGRAMS ${HOST_PACKAGE_DIR}/dnn/lib/libdnn.so DESTINATION lib)
    install(PROGRAMS ${HOST_PACKAGE_DIR}/dnn/lib/libhbrt_bayes_aarch64.so DESTINATION lib)
    
    if (EXISTS ${HOST_PACKAGE_DIR}/dnn/lib/libperfetto_sdk.so)
        message("File exists: ${HOST_PACKAGE_DIR}/dnn/lib/libperfetto_sdk.so")
        install(PROGRAMS ${HOST_PACKAGE_DIR}/dnn/lib/libperfetto_sdk.so DESTINATION lib)
    endif()
else()
    install(PROGRAMS ${HOST_PACKAGE_DIR}/dnn_x86/lib/libdnn.so DESTINATION lib)
    install(PROGRAMS ${HOST_PACKAGE_DIR}/dnn_x86/lib/libhbdk_sim_x86.so DESTINATION lib)
    if (EXISTS ${HOST_PACKAGE_DIR}/dnn_x86/lib/libperfetto_sdk.so)
        message("File exists: ${HOST_PACKAGE_DIR}/dnn_x86/lib/libperfetto_sdk.so")
        install(PROGRAMS ${HOST_PACKAGE_DIR}/dnn_x86/lib/libperfetto_sdk.so DESTINATION lib)
    endif()
endif()
相关推荐
柒儿吖2 小时前
rudp Reliable UDP 库在 OpenHarmony 的 lycium 适配与 CRC32 测试
c++·c#·openharmony
大模型玩家七七2 小时前
效果评估:如何判断一个祝福 AI 是否“走心”
android·java·开发语言·网络·人工智能·batch
拾光Ծ2 小时前
【优选算法】滑动窗口算法:专题一
c++·算法·滑动窗口·c++算法·滑动窗口算法·笔试面试
闻缺陷则喜何志丹2 小时前
【动态规划 AC自动机】P9188 [USACO23OPEN] Pareidolia S|普及+
c++·算法·动态规划·洛谷·ac自动机
cpp_25012 小时前
P10250 [GESP样题 六级] 下楼梯
数据结构·c++·算法·动态规划·题解·洛谷
qq_370773092 小时前
python实现人脸识别
开发语言·python·opencv
xiaoye-duck2 小时前
深入解析 STL 优先级队列:从原理到实战
c++·算法·stl
-小麦子-2 小时前
Python 里的 range 是干嘛的?
开发语言·python
lly2024062 小时前
CSS 图像拼合技术
开发语言