Bazel - 导入静态库时包括目录中的所有标头
Bazel - Including all headers from a directory when importing a static library
我是 Bazel 的新手,并试图在我的构建中添加静态库。
假设作为一个简单的例子,假设我有以下内容。
cc_import(
name = "my_test_lib"
static_library = "libmy_test_libtest.lib"
hdrs = ["libmy_test_libincludeheaderA.h",
"libmy_test_libincludeheaderB.h"]
visibility = ["//visibility:public"],
)
现在这工作正常。
但是,如果我有大量的包含并且包含目录中有许多子目录怎么办。我是否必须单独输入我的主项目所依赖的每个标头,或者我可以执行以下操作来基本上使该目录/子目录中的所有标头可用?
hdrs = [ "libmy_test_libinclude*"]
[这是对塞巴斯蒂安回答的补充。 这是我刚刚(从同事那里)学到的一个技巧,用于cc_import
:
假设您不希望标头"裸露",而是希望它们都位于以库名称为前缀的子目录中,以便像这样引用它们:
#include <openjpeg/openjpeg.h>
第一步是拥有一个如下所示的目录结构:
. <library root>
- include
- openjpeg
- openjpeg.h
- <other header files>
但是现在,如果您通过glob
公开这些头文件,例如glob(["mylib/include/openjpeg/*.h"])
或某些变体,如glob(["mylib/include/**/*.h"])
(甚至通过明确命名它们!),它们实际上并没有公开为#include <openjpeg/openjpeg.h>
而是#include "openjpeg.h"
or#include <include/openjpeg/openjpeg.h>
或类似的东西。
问题是cc_import
不负责任地不支持cc_library
所做的includes
属性,因此您不能只命名包含目录。
因此,请使用添加另一个间接寻址级别的标准计算机科学解决方法并使用它:
cc_library(name = "openjpeg",
includes = ["include"],
deps = ["openjpeg-internal"],
visibility = ["//visibility:public"],
)
cc_import(name = "openjpeg-internal",
hdrs = glob(["include/**/*.h"]),
static_library = ...,
visibility = ["//visibility:private"],
)
你需要的是glob
函数。
要在上面的示例中使用它,您将执行以下操作
cc_import(
name = "my_test_lib"
static_library = "lib/my_test_lib/test.lib"
hdrs = glob(["lib/my_test_lib/include/*.h"])
visibility = ["//visibility:public"],
)
这将在libmy_test_libinclude
下找到所有以.h
结尾的文件,并将它们放在cc_import
的hdrs
属性中。
Bazel 文档中提供了有关glob
的更多信息:https://docs.bazel.build/versions/master/be/functions.html#glob
注意:始终在 Bazel BUILD 文件的所有平台上使用正斜杠(即使在 Windows 上)。
多种球形模式
有时在 glob 中放入多个模式很有用,例如像这样
cc_import(
...
hdrs = glob([
"lib/my_test_lib/include/*.h",
"lib/my_test_lib/include/*.hpp",
"lib/my_test_lib/public/*.h",
]),
...
)
将 glob 与硬编码的文件列表组合在一起
另一个有用的事情是将 glob 与硬编码路径相结合。您可能在那里有几个您想要的文件,然后是一个您还想包含的目录。为此,您可以使用+
运算符将硬编码的路径列表与如下所示的 glob 结果连接
cc_import(
...
hdrs = [
"lib/my_test_lib/some_header.h",
] + glob([
"lib/my_test_lib/include/*.h",
]),
...
)
通配目录层次结构(当心大量包含)
glob
函数还支持在查找文件时遍历目录及其子目录。这可以使用**
球模式来完成。因此,例如,要获取my_test_lib
目录中的所有.h
文件,请使用此 glob
cc_import(
...
hdrs = glob([
"lib/my_test_lib/**/*.h",
]),
...
)
注意:这将包括指定目录下的所有文件,正如预期的那样。这可能会失控,因为它没有明确包含哪些文件。最好远离**
.
- 尝试导入pybind-opencv模块时出现libgtk错误
- 导入库可以跨dll版本工作吗
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 为什么 cmake 许可证<>样式不包括?
- 建议在运行时将带有类实例的列表从c++导入qml
- 计算平均值,不包括上次得分
- 从多个源构造一个对象,包括一个对象向量
- 导入/导出变量时出错
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 将QT项目导入Visual Studio 2019会给我带来很多LNK2001错误
- 是否可以将函数导入命名空间,但不能导出它?
- 如何将 CLion C++ 项目导入 Visual Studio?
- Python 3.8 不能与 Pybind11 一起导入 [Windows]
- 无法将标准库导入本机 android 项目中的头文件
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 在编译中包括 Botan 2
- Bazel - 导入静态库时包括目录中的所有标头
- 包括无导入标头文件的常数
- 我可以从C 中的库中包括/导入单个函数吗?