#写技术笔记巩固知识点#
自apollo 9.0开源版本发布以后,相信很多小伙伴都在学习。apollo 9.0的/apollo/modules里面已经罗列出了各种基础功能包,但是对于有些定制化需求,还得自己动手编写自己的功能包。如何编写功能包?编写后如何编译运行?本文将以创建一个test_bazel功能包为例作详细介绍。
(一)功能包的功能
本功能包打印打包后的字符串:"Hello" + name,其中name在main()函数中指定,打包函数在getName()函数中执行。
(二)功能包的文件组织架构
test_bazel
├── BUILD
├── cyberfile.xml
├── demo_lib
│ ├── BUILD
│ ├── getName.cc
│ └── getName.h
└── demo_main
├── BUILD
└── main.cc
(三)各文件代码
3.1 test_bazel目录下BUILD文件
load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_cc_binary", "apollo_package", "apollo_component")
load("//tools:cpplint.bzl", "cpplint")
package(default_visibility = ["//visibility:public"])
#编译规则
apollo_cc_binary(
name = "testBazel",#编译生成的可执行文件名
srcs = [
"//modules/test_bazel/demo_main:main.cc",#编译源文件
],
deps = [
":demo_lib",#编译依赖项
],
#linkstatic = True,
)
#编译依赖项规则
apollo_cc_library(
name = "demo_lib",
srcs = ["//modules/test_bazel/demo_lib:getName.cc"], # 包含所有必要的源文件
hdrs = ["//modules/test_bazel/demo_lib:getName.h"], # 包含所有必要的头文件
# 其他配置...
)
apollo_package()
cpplint()
3.2 test_bazel目录下cyberfile.xml文件
<package>
<name>test</name>
<version>1.0.0</version>
<description>
test component
</description>
<maintainer email="AD-platform">AD-platform@baidu.com</maintainer>
<type>module</type>
<src_path>//test</src_path>
<license>BSD</license>
<author>Apollo</author>
<depend type="binary" repo_name="cyber">cyber-dev</depend>
<builder>bazel</builder>
</package>
3.3 test_bazel/demo_lib目录下BUILD文件
load("//tools:apollo_package.bzl", "apollo_package")
load("//tools:cpplint.bzl", "cpplint")
package(default_visibility = ["//visibility:public"])
# 定义第二个嵌套文件夹demo_lib
# filegroup(
# name = "demo_lib",
# srcs = glob(["demo_lib/getName.cc", "*demo_lib/getName.h"]),
# # deps = [
# # "//some/other/package",
# # ],
# visibility = ["//visibility:public"],
# )
cc_library(
name = "getName_lib",
srcs = ["getName.cc"],
hdrs = ["getName.h"]
)
apollo_package()
cpplint()
3.4 test_bazel/demo_lib目录下getName.cc文件
// test_bazel/demo_lib/getName.cc
#include "getName.h"
std::string get_name(const std::string& name){
return "Hello" + name;
}
3.5 test_bazel/demo_lib目录下getName.h文件
// test_bazel/demo_lib/getName.h
#pragma once
#include <string>
std::string get_name(const std::string& name);
3.6 test_bazel/demo_main目录下BUILD文件
load("//tools:apollo_package.bzl", "apollo_package")
load("//tools:cpplint.bzl", "cpplint")
package(default_visibility = ["//visibility:public"])
# 定义第一个嵌套文件夹demo_main
# filegroup(
# name = "demo_main",
# srcs = glob(["demo_main/main.cc"]), # 匹配该文件夹内的所有 .cc 和 .h 文件
# # deps = [
# # # 列出该文件夹所依赖的其他包或库
# # "//some/other/package",
# # ],
# visibility = ["//visibility:public"], # 设置可见性,以便其他包可以引用这个模块
# )
cc_library(
name = "main",
srcs = ["main.cc"],
)
apollo_package()
cpplint()
3.7 test_bazel/demo_main目录下main.cc文件
#include "modules/test_bazel/demo_lib/getName.h"
#include <iostream>
int main()
{
for (int i = 0; i< 5; ++i)
{
std::cout << get_name(" Apollo ") << std::endl;
}
return 0;
}
(四)功能包的编译输出
4.1进入apollo 9.0 docker
bash docker/scripts/dev_into.sh
4.2编译test_bazel功能包
bazel build modules/test_bazel:all
4.3运行testBazel可执行文件
./bazel-bin/modules/test_bazel/testBazel
4.4程序输出
[oem@in-dev-docker:/apollo]$ ./bazel-bin/modules/test_bazel/testBazel
Hello Apollo
Hello Apollo
Hello Apollo
Hello Apollo
Hello Apollo
小伙伴们可以参考以上内容进行定制化需求的功能包开发。
以上。