目录
[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()