c++ 未找到Bazel包含文件

vcirk6k6  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(124)

**Edit(2022-05-28):**对于任何搜索bazel + sfml而最终到达这里的人,我放弃了尝试使用bazel从源代码编译它。

相反,我用brew安装了SFML。然后在WORKSPACE.bazel中:

new_local_repository(
    name = "SFML",
    path = "/opt/homebrew",
    build_file = "third_party/SFML/BUILD.bazel"
)

字符串
third_party/SFML/BUILD.bazel

cc_library(
    name = "sfml",
    srcs = glob(["lib/libsfml-*.dylib"]),
    hdrs = glob(["include/SFML/**/*.*"]),
    include_prefix = "SFML",
    strip_include_prefix = "include/SFML",
    visibility = ["//visibility:public"],
)


最后,作为任何BUILD.bazel中的依赖项:

cc_binary(
    name = "main",
    srcs = ["main.cc"],
    deps = [
        "@SFML//:sfml",
    ]
)


这允许我在main.cc中使用#include <SFML/Graphics.hpp>,到目前为止,它是有效的。
我正在尝试使用bazel从源代码构建SFML并在项目中使用它。现在我有一个非常简单的设置:

foo/
  src/
    main.cc
    BUILD
  third_party/
    SFML/
      ...
      BUILD
    BUILD
  WORKSPACE
# third_party/SFML/BUILD

load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "sfml",
    srcs = glob(["src/*.cpp"]),
    hdrs = glob(["include/*.hpp"]),
    copts = ["-Ithird_party/SFML/include"],
    linkopts = [
        "-lsfml‑system",
        "-lsfml‑window",
        "-lsfml‑graphics",
        "-lsfml‑audio",
    ],
    visibility = ["//visibility:public"]
)
# src/BUILD

load("@rules_cc//cc:defs.bzl", "cc_binary")

cc_binary(
    name = "mygame",
    srcs = ["main.cc"],
    deps = [
        "//third_party/SFML:sfml",
    ],
)

main.cc

#include "third_party/SFML/sfml/Graphics.hpp"
#include "third_party/SFML/sfml/System.hpp"
#include "third_party/SFML/sfml/Window.hpp"

int main() {
  // ...
}


当我运行bazel build //src:mygame时,我得到一个错误:

fatal error: 'third_party/SFML/Graphics.hpp' file not found


我也试过使用#include "third_party/SFML/Graphics.hpp",但也不起作用。
不确定正确的包含路径应该是什么。有什么建议吗?

plupiseo

plupiseo1#

通过查看SFML的项目结构,glob模式并没有捕获任何目标,因为文件嵌套在另一个名为SFML的文件夹中。
在您的情况下,检查bazel目标只会列出两个目标。

bazel query '@SFML//:sfml'

字符串
将输出两个目标。

  • @SFML//:sfml
  • @SFML//::BUILD.bazel

这意味着你的库在构建时是空的。因此导入的头文件找不到。
您可以将规则更新为

cc_library(
  name = "sfml",
  srcs = glob(["src/SFML/**/*.cpp", "src/SFML/**/*.hpp"]),
  hdrs = glob(["include/SFML/**/*.hpp", "include/SFML/**/*.inl"]),
  strip_include_prefix = "include",
  visibility = ["//visibility:public"]
)


我在glob模式中添加了另一个条目,因为SFML有inl文件和私有头文件。
我也是新来的stackoverflow,我希望我的回答能帮助你或至少给你一个方向。

相关问题