1.编译东西 要在根目录下,和WORKSPACE在同一级
例如,对于bazelbuild/examples
而BUILD文件一般与源文件并列
examples
└── cpp-tutorial
├──stage1
│ └── main
│ ├── BUILD
│ ├── hello-world.cc
│ └── WORKSPACE
进入到cpp-tutorial/stage1目录下(要进入到这个目录后可以直接看到WORKSPACE),然后运行以下指令:
bazel build //main:hello-world ( Labels start with //)
注意target中的//main:是BUILD文件相对于WORKSPACE文件的位置,hello-world则是我们在BUILD文件中命名好的target的名字。如果省略冒号,则假定目标名称与程序包名称的最后一个组成部分相同(???)。
2.头文件怎么引入,头文件路径问题
正常在rs_common模块
包含头文件应该从WORKSPACE所在的路径开始包含,(完整的路径,从WORKSPACE为根开始写)
比如
#include "rs_common/yaml/yaml_parser.h"
其实应该
#include "modules/rs_common/include/rs_common/yaml/yaml_parser.h"
解决这个问题的方法,是在rs_common模块下的BUILD
cc_library(
name = "rs_yaml",
hdrs = ["include/rs_common/yaml/yaml_parser.h"],
srcs = [
"src/yaml/yaml_parser.cpp",
"include/rs_common/debug/prompt.h",
],
deps = [
":encryptor",
"@yaml_cpp//:yaml-cpp",
],
copts = [
"-Imodules/rs_common/include",
# "-Iexternal/yaml_cpp/include", # 因为yaml库中写了includes配置项,includes可以继承
"-O3",
"-Wall",
"-std=c++11",
"-fPIC",
],
linkopts = ["-lstdc++fs"],
includes = ["include"],
)
如果不写,会报类似如下的错误:
ERROR: /home/zxj3/code/bazel_test/rs_read_RTK/BUILD:3:11: C++ compilation of rule '//rs_read_RTK:rs_RTK' failed (Exit 1) gcc failed: error executing command /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer '-std=c++0x' -MD -MF ... (remaining 16 argument(s) skipped)
Use --sandbox_debug to see verbose messages from the sandbox
rs_read_RTK/src/rs_RTK.cc:2:10: fatal error: include/rs_RTK.h: No such file or directory
#include "include/rs_RTK.h"
^~~~~~~~~~~~~~~~~~
compilation terminated.
INFO: Elapsed time: 0.187s, Critical Path: 0.04s
INFO: 0 processes.
FAILED: Build did NOT complete successfully
而BUILD中包含是从BUILD所在路径包含的
总结:
写.cpp .h时,包含头文件路径以WORKSPACE路径为根
写BUILD源文件路径时,以BUILD路径为根
3.:和@和// :
":"表示依赖来自于文件内部
"@“表示来自于外部WORKSPACE,”//"大概也是这个用法
编译时,
bazel build //modules/rs_common...
rs_common里面所有target都会编译
bazel build //modules/rs_common...
bazel build //modules/rs_common:rs_yaml
4.copts可以理解为gcc传-D -I参数
5.grep -r “字符串” 查字符串
先把改好的三个模块放在阿波罗一起编译
编译速腾rs_demo美引入Cyber RT看看编译是否通过
再看改了之后编译