使用Bazel构建C库

使用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

我正在尝试为以下目录结构编写Bazel构建文件

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__"],
    )
    
  • 将somelib/src/BUILD更新为:

    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”