Как решить вопрос «незадекларированного включения» в базу? ошибка?

Я новичок в bazel, и мне не удается собрать пакет C ++ с

ОШИБКА: / путь / к / пакету / BUILD: номер белья: 1 незадекларированное включение (я) в правиле «// путь / к / пакету: имя»:
в этом правиле отсутствуют объявления зависимостей для следующих файлов, включенных в ‘path / to / package / source_file.cpp’

…сопровождаемый списком заголовочных файлов в другом каталоге. Эти файлы не являются частью создаваемого пакета, но извлекаются из других источников.

У меня вопрос, как правильно добавить объявление в файл BUILD, чтобы устранить ошибку?

Согласно онлайн-документу Bazel Вот Я должен добавить каждый заголовок к SRCS список. (Для ясности, это заголовки, которые используются внутри библиотеки, которую я создаю, и не часть открытого интерфейса, поэтому они не принадлежат HDRs.) Но если я попробую это,

  srcs = [ ..., "path/to/dependent/headers/header.h",]

Я получаю сообщение об ошибке

ОШИБКА: … пересекает границу подпакета … (возможно, вы хотели
поставить двоеточие здесь: …?)

потому что каталог с заголовками не является пакетом Bazel.

Если я попытаюсь изменить финал / на двоеточие, как показано в этом сообщении об ошибке,

  srcs = [ ..., "path/to/dependent/headers:header.h",]

затем

ОШИБКА: … имена целей не могут содержать «:».

Базель C ++ учебник Вот, в разделе «Дополнительные пути включения» говорится, что внешние каталоги включения должны быть объявлены через копты:

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

Но добавив, что -I флаг делает не Откажитесь от ошибки «необъявленное включение (я)»!

$ bazel version
Build label: 0.4.3
Build target: bazel-out/local-fastbuild/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Thu Dec 22 12:31:25 2016 (1482409885)
Build timestamp: 1482409885
Build timestamp as int: 1482409885

2

Решение

Базель хочет, чтобы вы зависели от заголовков (т.е. поместите их в deps). По сути, вы должны создать cc_library для этих заголовков. Положить заголовки в hdrs не раскрывает их публично, а просто выставляет их правилам, которые зависят от этой библиотеки (что именно то, что вы хотите). Итак, вы будете иметь:

# third_party/some_lib/BUILD
cc_library(
name = "headers",
hdrs = glob(["*.h"]),
visibility = ["//path/to/package:__pkg__"],
)

Обратите внимание, что вы должны заменить // path / to / package на ваш фактический целевой пакет, но __pkg__ Выше буквально: так вы указываете «видимый для этого пакета». Тогда никакие другие пакеты не смогут получить доступ к этим заголовкам.

Затем добавьте //third_party/some_lib:headers в вашей цели deps,

copts просто используются для изменения путей поиска заголовка в C ++, а не Bazel. Базель всегда предполагает, что ты сделаешь #include "path/relative/to/your/workspace/dir.h", но если у вас есть источник вроде:

#include "foo.h"

где foo.h Вы можете сказать по адресу Third_party / some_lib / includes / foo.h copts = ["-Ithird_party/some_lib/includes"] чтобы добавить это к пути поиска заголовка C ++.

2

Другие решения

Я встретил аналогичную проблему «незадекларированное включение (я) в правиле», которую я решил, удалив файлы кэша базеля в /root/.cache/bazel/. Надежда помогает

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector