解析luckfox_pico_rtsp_yolov5的cmakelists

解析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 中的一种现代和推荐的方式来引用线程库,它提供了更好的可读性、可移植性和一致性。

Thonny_rpi_pico 是适用于 Raspberry Pi Pico 微控制器的集成开发环境(IDE)。Raspberry Pi Pico 是由 Raspberry Pi 基金会开发的一款低成本、高性能的微型电子产品。它采用了 RP2040 芯片,拥有双核 Arm Cortex-M0+ 处理器和大量的 I/O 引脚,适用于各种物联网、嵌入式系统和电子项目。 Thonny_rpi_pico 提供了一个简单易用的开发环境,供初学者和专业开发人员使用。它具有直观的用户界面,集成了 Python 解释器和编译器,并提供了代码编辑、调试和运行等功能。它还支持将代码上传到 Raspberry Pi Pico 上运行,并与其他设备进行通信。 使用 Thonny_rpi_pico,用户可以编写和调试 Python 代码,实现各种功能和应用。用户可以通过串口连接 Raspberry Pi Pico,并使用 Thonny_rpi_pico 进行代码编写和调试。通过 Thonny_rpi_pico,用户可以直接在电脑上编辑和运行代码,并通过串口将程序上传到 Raspberry Pi Pico 上进行实时运行。 Thonny_rpi_pico 还提供了丰富的示例代码和文档,帮助用户快速入门和掌握 Raspberry Pi Pico 的开发。无论是学习嵌入式系统编程,还是开发物联网设备,Thonny_rpi_pico 都是一个强大的工具。它以其简洁易用和功能强大而受到开发者的喜爱。 总而言之,Thonny_rpi_pico 是适用于 Raspberry Pi Pico 的集成开发环境,提供了代码编辑、调试和运行等功能。它是一个强大的工具,适用于各种嵌入式系统和物联网项目的开发。无论是初学者还是专业开发人员,都可以利用 Thonny_rpi_pico 开发出高性能的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值