使用Bazel构建C库
我正在尝试为以下目录结构编写Bazel构建文件使用Bazel构建C库,bazel,Bazel,我正在尝试为以下目录结构编写Bazel构建文件 thirdparty |_WORKSPACE |_somelib | |_src | |_ a.c | |_ BUILD | |_include | |_a.h |_include |_ b.h 当前生成文件:thirdparty/somelib/src/BUILD cc_library( name = "a
thirdparty
|_WORKSPACE
|_somelib
| |_src
| |_ a.c
| |_ BUILD
| |_include
| |_a.h
|_include
|_ b.h
当前生成文件:thirdparty/somelib/src/BUILD
cc_library(
name = "a",
srcs = ["a.c"],
hdrs = ["thirdparty/somelib/include/a.h"],
)
此生成文件导致错误:
使用的命令:bazel build somelib/src:a
错误:/thirdparty/somelib/src/BUILD:1:1:没有这样的包'thirdparty/somelib/include/a.h':在包路径上找不到生成文件并由'//a/src:l引用
错误:分析目标“//somelib/src:a”失败;构建中止
我需要一些帮助来找出构建文件解决方案的错误所在
有许多方法可以解决此问题,其中之一是:
BUILD
文件添加到somelib/include
,内容如下:
filegroup(
name = "headers",
srcs = ["a.h"],
visibility = ["//somelib/src:__pkg__"],
)
cc_library(
name = "a",
srcs = ["a.c"],
hdrs = ["//somelib/include:headers"],
)
bazel build//somelib/src:a
构建它somelib/src/BUILD
移动到somelib/BUILD
,因此现在包是//somelib
,有两个子目录,src
和include
,它们都没有自己的构建文件(因此它们本身不是包)。然后更新somelib/BUILD
如下:
cc_library(
name = "a",
srcs = ["src/a.c"],
hdrs = ["include/a.h"],
)
您可以像bazel build//somelib:a
那样构建它
解释
请参见当我继续使用替代解决方案时,我遇到了以下错误,somelib/src/a.c:1:25:致命错误:a.h:没有这样的文件或目录#include“a.h”编译终止。在替代解决方案中,当我添加copts=[“-isomolib/include”]时,它起了作用。是的,这是解决问题的一种方法,另一种是使用相对工作空间的#include,例如
#include“somelib/include/a.h”
。