bazel使用:https://blog.gmem.cc/bazel-study-note

BUILD 文件中for用法示例

[cc_library(
name = “libopencv_” + arch,
srcs = [OPENCVANDROIDSDK_NATIVELIBS_PATH + arch + “/” + OPENCV_LIBRARY_NAME],
hdrs = glob([
OPENCVANDROIDSDK_JNI_PATH + “include//*.h",
OPENCVANDROIDSDK_JNI_PATH + "include/
/*.hpp”,
]),
includes = [
OPENCVANDROIDSDK_JNI_PATH + “include”,
],
visibility = ["//visibility:public"],
alwayslink = 1,
) for arch in [
“arm64-v8a”,
“armeabi-v7a”,
“x86”,
“x86_64”,
]]

cc_library copts用来给加编译选项,常见的有加头文件搜索目录:

[workspace]/
WORKSPACE
third_party/
some_lib/
include/
some_lib.h
BUILD
some_lib.cc
Bazel希望用third_party/some_lib/include/some_lib.h方式包含some_lib.h,但是some_lib.cc可能跟希望用"include/some_lib.h"(为什么不能直接用此方式?)方式包含。为了使得包含路径有效,需要在third_party/some_lib/BUILD文件中将some_lib/目录添加到头文件包含路径的搜索列表中:

cc_library(
name = “some_lib”,
srcs = [“some_lib.cc”],
hdrs = [“some_lib.h”],
copts = ["-Ithird_party/some_lib"],
)

Bazel 中子层目录b需要包含上层目录a的头文件,则需要将a添加到b的依赖

参考文章https://www.jianshu.com/p/c2f6acd74731

Bazel将头文件放到一个目录下,用BUILD打包Target,其他源文件引用这些头文件统一依赖这个Target

cc_library(
name = “facedetection_post”,
srcs = [
“BaseAnchorGenerator.h”,
“Common.h”,
“GeneralFunc.h”,
],
hdrs = [“GeneralFunc.h”],
)

deps = ["//src/face/facedetection:facedetection_post",
],

测试demo - 目录结构如下

├── WORKSPACE
├── a
│   ├── BUILD
│   ├── a.cc
│   └── a.h
├── b
│   ├── BUILD
│   ├── b.cc
│   └── b.h

a打包成库

cc_library(name = "a",srcs = ["a.cc"],hdrs = ["a.h"],
)

b打包成可执行文件,依赖库a及头文件a

cc_binary(name = "b",srcs = ["b.cc","b.h"],copts = ["-Ia"],             #此处是为了在b.h中直接#include "a.h" ,去掉这个选项,则b.h引用头文件a需要写成#include "a/a.h"deps = ["//a"],
)

如果想把所有头文件放到一个上层目录,如下所示,可以编写BUILD如下

├── WORKSPACE
├── a
│   ├── BUILD
│   └── a.cc
├── b
│   ├── BUILD
│   └── b.cc
└── header├── BUILD├── a.h└── b.h
cc_library(name = "header",srcs = [],#hdrs = ["a.h", "b.h"],hdrs = glob(["**/*.h","**/*.hpp"]),# copts =["-Iheader"],visibility = ["//visibility:public"],
)cc_library(name = "a",srcs = ["a.cc"],#hdrs = ["//header:a.h"],  #错误,添加依赖后不需要copts = ["-Iheder"], #加上此行表示在workspacede 的header目录下搜索头文件,否则a.cc中需要写成header/a.hdeps = ["//header"],
)

上例中,
以下错误用法要注意:其他包中文件对本包不可见,只能添加依赖或者其他包导出要引用的文件

hdrs = ["//header:a.h"], xx

exports_files([“header/a.h”]) //将本包的target暴露给其他包使用(引用上层公共目录头文件可以考虑)
exports_files
exports_files([label, …], visibility, licenses)
exports_files()指定一个属于此package的文件列表,导出给其他package使用。这些文件往往未在BUILD文件中提及。

一个package的BUILD文件,一般只会引用其他package的BUILD文件提及到的文件,作为一个rule的输入或输出。其余文件并不与特定的rule相关联,仅仅是“data”。exports_files就可以保证这些文件也可以被其他package引用到(这对于shell脚本之类的数据特别有用)。

Bazel递归获取目录下文件

cc_library:
copts = ["-std=c++14"]+["-Iinclude/"] 指定C++14标准编译,并在当前或者依赖包的include目录下寻找头文件

tflite_jni_library库编译BUILD编写示例

tflite_jni_binary(
name = “libglai.so”,
srcs = glob([
.cc",
"
.h”,
]),
deps = [],
linkopts = ["-landroid", “-llog”, “-lEGL”, “-lnativewindow”, “-lGLESv2”]
)

动态库查找问题
因为没有传递LIBRARY_PATH,所以boost库找不到。LIBRARY_PATH和LD_LIBRARY_PATH的区别见:

https://stackoverflow.com/questions/4250624/ld-library-path-vs-library-path

IBRARY_PATH is used by gcc before compilation to search directories containing static libraries that need to be linked to your program.
LD_LIBRARY_PATH is used by your program to search directories containing shared libraries after it has been successfully compiled and linked.

解决方案就在通过–action_env指定。

1 bazel build //3rdlib/test:bintest --action_env=LIBRARY_PATH=:/home/myaccount/boost_1_68_0/release/lib/
https://bazel.build/designs/2016/06/21/environment.html

bazel使用学习杂记相关推荐

  1. Fortran学习杂记(一)

    Fortran学习杂记(一) 1. 内置函数 1) 数值运算 常见:- abs( ) - aimag( ) -conj( ) -max( ) ** -min( ) - mod(a, b) - real ...

  2. 51单片机学习杂记——基于STC89C52RC

    51单片机学习杂记--基于STC89C52RC 我是看的b站郭天祥老师的课,说实话,我觉得我能力不是很够,所以记得很杂.废物了属于是. 接下来就是正文了 基本的元器件以及字母符号含义: 电容:帮助晶振 ...

  3. Python日常学习杂记

    Python日常学习杂记 python -c 的作用 在命令行里执行python时,如果加上 -c,即 python -c xxx 那么,xxx就被当做一条指令(command)来执行,否则,就当做脚 ...

  4. 【菜鸟C++学习杂记】ASCII码转换和显示

    笔者今年刚考上华东某高校的计算机研究生,本科虽是计算机学院,但期间主攻C#和Unity游戏开发,研究生属于小跨到计算机科学与技术,目前在进行硕导给的假期期间学习C++的任务,此类杂记主要记录下编码过程 ...

  5. Python学习杂记之静态网页学习

    每日一丧:我就是丧本丧了 笔者最近在为学习django而做准备,开始看起了网页,我们先说几个好一点的学习网站吧. 初学前端,笔者最常浏览的就是W3School. 链接:http://www.w3sch ...

  6. rocketmq学习杂记

    rocketmq总体架构图,来源于 https://rocketmq.apache.org/docs/rmq-arc/,可参考: 1.本地部署遇到的问题: rocketmq默认配置对内存要求较高,启动 ...

  7. 对学姐的U-net网络的学习杂记

    .npy文件是一种存放数据的文件格式..npy格式是用python程序生成的,只能用python程序读取和显示. 转自:https://jingyan.baidu.com/article/7f41ec ...

  8. 学习杂记2:固态硬盘

    12.29日看群 目录 一.主流的固态硬盘 二.PCIE4.0协议 一.主流的固态硬盘 固态硬盘(SSD,Solid State Disk,一般的,装系统就是把系统文件装进固态硬盘里) 1.SATA3 ...

  9. 【Obj-C】学习杂记-1

    2014/12/20 夜 之前大学学过C++,忘得差不多了,前阵子看了些<[中文版]C语言编程:一本全面的C语言入门教程(第3版)>的pdf版,觉得慢,所以就直接开始看<Object ...

最新文章

  1. java流的写法_java IO-过滤流类的写法
  2. [云炬ThinkPython阅读笔记]2.7 注释
  3. 实现锁死的有滚动条的div的表格(datagird)
  4. apache 隐藏php版本,PHP+Apache环境中怎么隐藏Apache版本
  5. oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及临时解决方案...
  6. mysql中的各种函数(日期函数、字符串函数、数学函数...)
  7. 在ie6下文字颜色不兼容的解决方法
  8. XeLatex在window上编译较慢的解决方法
  9. 项目管理十大知识领域之项目资源管理
  10. 数据仓库常见建模方法与大数据领域建模实例综述
  11. windows释放GPU内存方法
  12. 插值法(最邻近,双线性,双三次),图像放缩 python实现
  13. python模拟seo_百度统计原理分析-利用Python实现模拟访问
  14. 台积电偷笑:就算Intel技术牛我也要赶超你
  15. 荣耀YOYO建议新增快递取件服务
  16. activity从底部弹出动画
  17. Java房地产销售管理系统_JAVA JSP房地产销售系统 源代码 论文
  18. java导入Excel表格数据
  19. P2P资源共享环境下的版权冷战
  20. sec(x)多次积分

热门文章

  1. 荷兰海牙旅游景点,让你领略欧洲的美丽风光
  2. cuda half编程的各种坑
  3. 基于DS3231时钟模块的stm32 程序,源码
  4. 2015最新免费pdf转换成word转换器
  5. 种子激光器市场现状及未来发展趋势报告
  6. 不锈钢侧冲孔发光字制作过程中需留神的细节问题
  7. flink sql脚本
  8. 【GT-安卓应用开发之更改头像】
  9. JQuery定时器和轮播图
  10. 重启Oracle服务