解析luckfox_pico_rtsp_yolov5的cmakelists
cmakelists文件对于一个项目而言意味着它如何被编译的,对于任意一个项目,从他的cmakelists文件开始分析有助于更好的了解这个项目。
cmake_minimum_required(VERSION 3.10)
设置cmake的版本需求
set(SDK_PATH /home/eleclong/sdk/luckfox-pico)
if(NOT SDK_PATH)
message(WARNING "Please Set Luckfox-pico SDK Path. Such as:export LUCKFOX_SDK_PATH=/home/user/luckfox-pico")
return()
endif()
设置SDK_PATH 灵活调整这个路径
set(CMAKE_C_COMPILER "${SDK_PATH}/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc"
)
set(CMAKE_CXX_COMPILER "${SDK_PATH}/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g++"
)
可以看到这边指定了sdk中的交叉编译工具,注意不要指定错了,要跟芯片型号对应,至于是否需要设置sysroot,这取决于你的编译器和项目需求。sysroot是指定编译器查找标准库、头文件、以及链接器在编译过程中查找库文件的根目录。如果你的交叉编译器配置正确,并且它能够找到正确的库和头文件,那么可能不需要显式设置sysroot。但是,通常设置sysroot是一个好习惯,因为它可以确保编译器使用的是目标平台的正确版本。
project(luckfox_rtsp_yolov5)
project要放到设置编译器之后,不然不起作用哦
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
link_directories(${SDK_PATH}/media/mpp/release_mpp_rv1106_arm-rockchip830-linux-uclibcgnueabihf/lib/)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/ 3rdparty.out)
包含库的目录,然后包含了一个子目录,它会执行里边的cmakelsits,内容如下:
cmake_minimum_required(VERSION 3.15)
project(rknn_model_zoo_3rdparty_libs)
set(TARGET_SOC "rv1106")
set (TARGET_LIB_ARCH armhf_uclibc)
# rknn runtime
set(RKNN_PATH ${CMAKE_CURRENT_SOURCE_DIR}/rknpu2)
set(LIBRKNNRT ${RKNN_PATH}/${CMAKE_SYSTEM_NAME}/armhf-uclibc/librknnmrt.so)
set(LIBRKNNRT_INCLUDES ${RKNN_PATH}/include PARENT_SCOPE)
install(PROGRAMS ${LIBRKNNRT} DESTINATION lib)
set(LIBRKNNRT ${LIBRKNNRT} PARENT_SCOPE)
# rga
set(RGA_PATH ${CMAKE_CURRENT_SOURCE_DIR}/librga)
set(LIBRGA ${RGA_PATH}/${CMAKE_SYSTEM_NAME}/${TARGET_LIB_ARCH}/librga.a PARENT_SCOPE)
set(LIBRGA_INCLUDES ${RGA_PATH}/include PARENT_SCOPE)
install(PROGRAMS ${RGA_PATH}/${CMAKE_SYSTEM_NAME}/${TARGET_LIB_ARCH}/librga.so DESTINATION lib)
主要对rknn和rga进行了配置,需要注意的是还有armhf_uclibc
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
add_definitions(-DRV1106_1103)
设置安装的目录,然后定义了一个宏定义
#Opencv 4
set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
#Thread
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
找到这两个库
add_executable(${PROJECT_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc
${CMAKE_CURRENT_SOURCE_DIR}/src/luckfox_mpi.cc
${CMAKE_CURRENT_SOURCE_DIR}/src/postprocess.cc
${CMAKE_CURRENT_SOURCE_DIR}/src/yolov5.cc
)
将源文件添加到执行文件
add_compile_options(-g -Wall
-DISP_HW_V30 -DRKPLATFORM=ON -DARCH64=OFF
-DROCKIVA -DUAPI2
-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
)
-g:生成调试信息。这通常用于在开发过程中帮助调试程序。
-Wall:打开几乎所有的警告信息。这可以帮助开发者发现潜在的问题。
-DISP_HW_V30:定义宏 ISP_HW_V30。isp 3.0 硬件版本
-DRKPLATFORM=ON:rk的代码需要加这个
-DARCH64=OFF:不是64位的
-DROCKIVA:使用rockiva
-DUAPI2:使用 UAPI2。
-D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE
-D_FILE_OFFSET_BITS=64 大文件支持
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_CURRENT_SOURCE_DIR}/lib:/usr/lib")
链接参数,CMAKE_EXE_LINKER_FLAGS 是 CMake 中的一个变量,用于设置链接可执行文件时使用的链接器标志。这个变量可以被用来添加全局的链接器选项,这些选项将应用于项目中所有可执行文件的链接过程。
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${LIBRKNNRT}
Threads::Threads
rockiva
sample_comm
rockit
rockchip_mpp
rkaiq
pthread
m
dl
rtsp
rga
)
用到的库
target_include_directories(${PROJECT_NAME} PRIVATE
${OpenCV_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/utils
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/rknpu2/include
${CMAKE_CURRENT_SOURCE_DIR}/common
${CMAKE_CURRENT_SOURCE_DIR}/common/isp3.x
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/include/rknn
${CMAKE_CURRENT_SOURCE_DIR}/include/rkaiq
${CMAKE_CURRENT_SOURCE_DIR}/include/rkaiq/uAPI2
${CMAKE_CURRENT_SOURCE_DIR}/include/rkaiq/common
${CMAKE_CURRENT_SOURCE_DIR}/include/rkaiq/xcore
${CMAKE_CURRENT_SOURCE_DIR}/include/rkaiq/algos
${CMAKE_CURRENT_SOURCE_DIR}/include/rkaiq/iq_parser
${CMAKE_CURRENT_SOURCE_DIR}/include/rkaiq/iq_parser_v2
${CMAKE_CURRENT_SOURCE_DIR}/include/rkaiq/smartIr
)
对应的头文件
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/luckfox_rtsp_yolov5_demo")
install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX})
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/model/coco_80_labels_list.txt DESTINATION ${CMAKE_INSTALL_PREFIX}/model)
file(GLOB RKNN_FILES "${CMAKE_CURRENT_SOURCE_DIR}/model/*.rknn")
install(FILES ${RKNN_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/model)
安装
额外的知识点
总的来看这个cmakelists比较简单,编译关系非常清楚,但是还有有一些知识点的:
运行时动态库路径添加
注意设置程序运行时去哪找动态库,这里使用了
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_CURRENT_SOURCE_DIR}/lib:/usr/lib")
其中-Wl,-rpath-link 确保链接器在生成可执行文件时将指定的路径添加到 rpath 中,这样在运行时动态链接器能够找到这些库。
THREADS_PREFER_PTHREAD_FLAG这个变量的设置
这行CMake命令用于设置CMake在查找线程库时的偏好设置。具体来说,它告诉CMake在检测可用的线程库时,优先选择使用 POSIX 线程(pthread)的实现。
在某些系统上,可能存在多种实现线程的库,比如 Windows 上的 Win32 线程库和 POSIX 线程库。使用这个设置后,如果系统同时支持 POSIX 线程和另一种线程库,CMake 会优先选择 POSIX 线程库。
Threads::Threads
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${LIBRKNNRT}
Threads::Threads}
是 CMake 中的 “target-based” 引用语法,用于指定链接到特定目标的库。这种语法是在 CMake 3.1 版本引入的,目的是提供一种更清晰和更具体的方式来引用目标。在 CMake 中,find_package(Threads REQUIRED) 命令会查找可用的线程库,并设置一个名为 Threads::Threads 的别名,这个别名代表了线程库的目标。使用这个别名,你可以在 target_link_libraries 命令中直接引用线程库,而不需要知道实际的库文件名或路径。当你使用 target_link_libraries 时,CMake 会根据 Threads::Threads 别名自动链接到适当的线程库,这通常是基于系统默认的线程实现,如 POSIX 线程(-lpthread)。
总结来说,Threads::Threads 是 CMake 中的一种现代和推荐的方式来引用线程库,它提供了更好的可读性、可移植性和一致性。