执行器是AimRT六大模块之一,其主要作用是当我们向其传递任务的时候,可以对任务进行执行;
详细的关于AimRT的操作可以参考下面的官方文档:
Executor — AimRT v0.10.0 documentation
AimRT中关于执行器的种类有很多,但是大致是基于普通的执行器executor、基于协程的执行器executor co这两种执行器进行开发和改进的;
一、线程执行器
接下来我们还是实现一个示例代码,代码的结构如下所示:
executor_normal
├── build.sh
├── cmake
│ └── GetAimRT.cmake
├── CMakeLists.txt
└── src
├── app
│ └── executor_normal_app
├── CMakeLists.txt
├── install
│ ├── cfg
│ │ └── executor_normal.yaml
│ └── start_executor_normal.sh
├── moudle
│ └── executor_normal_moudle
│ ├── CMakeLists.txt
│ ├── executor_normal.cc
│ └── executor_normal.h
└── pkg
└── executor_normal_pkg
├── CMakeLists.txt
└── pkg_main.cc
接下来我们依次实现上面的文件;
1. 主项目的CMakeLists.txt
cmake_minimum_required(VERSION 3.24) # 设置cmake的版本
project(helloworld LANGUAGES C CXX) # 设置项目名并支持C/C++
set(CMAKE_CXX_STANDARD 20) # 设置C++的编译版本
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 编译器必须支持C++20,否则报错
set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器特有的扩展(如GNU的 -std=gnu++20)
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) # 将策略 CMP0077 的默认行为设置为 NEW。
include(cmake/GetAimRT.cmake) # 调用AimRT
add_subdirectory(src) # 将src目录下的CMakeLists.txt也加入构建系统中
其结构跟我们上一节的Helloworld实现的结构类似;
2. /cmake/GetAimRT.cmake
include(FetchContent) # 引入 FetchContent 模块,提供从远程仓库(如 Git)下载和管理依赖项的功能。
# 声明依赖项信息
FetchContent_Declare(
aimrt # 依赖项的名称
GIT_REPOSITORY https://github.com/AimRT/aimrt.git # 依赖项的github的URL地址
GIT_TAG v1.x.x) # 依赖项的版本
# 检测依赖项是否被下载
FetchContent_GetProperties(aimrt)
# 如果依赖项被下载,此时会生成变量 aimrt_POPULATED用来标记
if(NOT aimrt_POPULATED)
FetchContent_MakeAvailable(aimrt) # 实际执行下载操作
endif()
用于获取AimRT;
3. /src/CMakeLists.txt
add_subdirectory(module/executor_normal_moudle)
add_subdirectory(pkg/executor_normal_pkg)
这里我们引用 src 下的各个子目录;
4. /src/module/executor_normal_moudle/CMakeLists.txt
file(GLOB_RECURSE src ${CMAKE_CURRENT_SOURCE_DIR}/*.cc)
add_library(executor_normal_moudle STATIC)
add_library(executor_normal::executor_normal_moudle ALIAS executor_normal_moudle)
target_sources(executor_normal_moudle PRIVATE ${src})
target_include_directories(
executor_normal_moudle
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..)
# 引用aimrt_module_cpp_interface
target_link_libraries(
executor_normal_moudle
PRIVATE yaml-cpp::yaml-cpp
PUBLIC aimrt::interface::aimrt_module_cpp_interface)
这里我们实际上是将moudle模块块编译成了对应的静态库;
5. /src/pkg/executor_normal_pkg/CMakeLists.txt
# 获取当前文件夹名
string(REGEX REPLACE ".*/\(.*\)" "\\1" CUR_DIR ${CMAKE_CURRENT_SOURCE_DIR})
# 生成命名空间相关变量
get_namespace(CUR_SUPERIOR_NAMESPACE)
string(REPLACE "::" "_" CUR_SUPERIOR_NAMESPACE_UNDERLINE ${CUR_SUPERIOR_NAMESPACE})
# 设置目标名称和别名
set(CUR_TARGET_NAME ${CUR_SUPERIOR_NAMESPACE_UNDERLINE}_${CUR_DIR})
set(CUR_TARGET_ALIAS_NAME ${CUR_SUPERIOR_NAMESPACE}::${CUR_DIR})
file(GLOB_RECURSE src ${CMAKE_CURRENT_SOURCE_DIR}/*.cc)
# 创建共享库并带别名
add_library(${CUR_TARGET_NAME} SHARED)
add_library(${CUR_TARGET_ALIAS_NAME} ALIAS ${CUR_TARGET_NAME})
# 添加源文件到目标
target_source

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



