Как заставить Bazel связать ICU с внешней зависимостью? ⇐ C++
-
Гость
Как заставить Bazel связать ICU с внешней зависимостью?
Я получаю две разные ошибки в зависимости от того, какую цель я создаю. Я могу собрать //:utils и //:utils_test, но не //:app. Я не могу запустить тесты после их создания. У меня Mac m1, я использую bazel от homebrew и clang от xcode. Я пытаюсь использовать цели сборки из включенного файла BUILD в icu. Сначала я попытался создать свой собственный файл icu.BUILD, но не смог включить файлы в каталог icu/source/common, поэтому просто использовал их. Кажется немного странным, что в одном файле пропущено больше символов, чем в другом.
Это ошибка, которую я получаю при попытке запустить bazel test //:utils_test.
ИНФОРМАЦИЯ: Из тестирования //:utils_test: ==================== Тестовый вывод для //:utils_test: dyld[15553]: символ не найден в плоском пространстве имен '__ZN6icu_738ByteSink15GetAppendBufferEiiPciPi' =============================================== ============================= Цель //:utils_test актуальная: базель-bin/utils_test ИНФОРМАЦИЯ: Затраченное время: 0,275 с, критический путь: 0,20 с. ИНФОРМАЦИЯ: 2 процесса: 2 дарвин-песочницы. ИНФОРМАЦИЯ: сборка завершена, 1 тест ПРОЙДЕН, всего 2 действия. //:utils_test завершился неудачно через 0,1 с. Это ошибка, которую я получаю при попытке запустить bazel build //:app.
ОШИБКА: /Users/default/Projects/icu-demo/BUILD:10:10: Ошибка связывания приложения: (Выход 1): Ошибка cc_wrapper.sh: ошибка при выполнении команды (из целевого //:приложения) external/local_config_cc/cc_wrapper.sh @bazel-out/darwin_arm64-fastbuild/bin/app-2.params Используйте --sandbox_debug, чтобы просмотреть подробные сообщения из песочницы и сохранить корень сборки песочницы для отладки. Неопределенные символы для архитектуры Arm64: "icu_73::UnicodeString::toLower()", ссылка на: ToLower(std::__1::basic_string const&) в libutils.a(utils.o) «icu_73::ByteSink::GetAppendBuffer(int, int, char*, int, int*)», ссылка на: vtable для icu_73::StringByteSink в libutils.a(utils.o) "icu_73::ByteSink::Flush()", ссылка на: vtable для icu_73::StringByteSink в libutils.a(utils.o) "icu_73::ByteSink::~ByteSink()", ссылка на: icu_73::StringByteSink::StringByteSink(std::__1::basic_string< char, std::__1::char_traits, std::__1::allocator>*, int) в libutils.a(utils.o) icu_73::StringByteSink::~StringByteSink() в libutils.a(utils .о) «typeinfo для icu_73::ByteSink», ссылка на: typeinfo для icu_73::StringByteSink в libutils.a(utils.o) «vtable для icu_73::ByteSink», ссылка на которую: icu_73::ByteSink::ByteSink() в libutils.a(utils.o) ПРИМЕЧАНИЕ. Отсутствие виртуальной таблицы обычно означает, что первая невстроенная виртуальная функция-член не имеет определения. ld: символы не найдены для архитектуры Arm64 clang: ошибка: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов) Ошибка в дочернем процессе «/usr/bin/xcrun». 1 Цель //: приложение не удалось собрать. Используйте --verbose_failures, чтобы просмотреть командные строки неудачных шагов сборки. ИНФОРМАЦИЯ: Затраченное время: 0,168 с, критический путь: 0,11 с. ИНФО: 2 процесса: 2 внутренних. ОШИБКА: сборка НЕ завершена успешно. РАБОЧЕЕ ОБЛАСТЬ
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( имя = "ИКУ", sha256 = "a457431de164b4aa7eca00ed134d00dfbf88a77c6986a10ae7774fc076bb8c45", Strip_prefix = "ИКУ", urls = ["https://github.com/unicode-org/icu/rele ... _1-src.tgz"], ) http_archive( имя = "крошечный тест", sha256 = "71f366e680606e18268e6b9673a65c44c9e672f7356a61ffbcd3502c6a8eea0b", Strip_prefix = "TinyTest-460c9492d927689b9db7f28d8742705dc0bbee62", urls = ["https://github.com/headhunter45/TinyTes ... bbee62.zip"], ) СТРОИТЬ
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") cc_library( имя = "Утилиты", srcs = ["utils.cpp"], hdrs = ["utils.h"], deps = ["@icu//source/common:platform"], ) cc_binary( имя = "приложение", srcs = ["app.cpp"], deps = ["утилиты"], ) cc_test( имя = "utils_test", srcs = ["utils_test.cpp"], депс = [ "утилиты", "@tinytest", ], ) utils.h
#include std::string ToLower(const std::string& text); utils.cpp
#include "utils.h" #include #include "unicode/unistr.h" используя icu::UnicodeString; используя std::string; строка ToLower(const string& text) { UnicodeString ustr = UnicodeString::fromUTF8(текст); строковый результат; устр.toLower(); ustr.toUTF8String(результат); вернуть результат; } utils_test.cpp
#include "utils.h" #include #include #include "tinytest.h" использование пространства имен TinyTest; использование пространства имен std; int main(int argc, char* argv[]) { результаты TestResults; результаты += Execute_suite(make_test_suite( "ToLower(const std::string&)", ToLower, { make_test("должна получить пустую строку", (строка) "", make_tuple("")), make_test("должна получить ту же строку", (строка) "та же строка", make_tuple("та же строка")), make_test("должна получить строку в нижнем регистре", (строка) "строка в нижнем регистре", make_tuple("СТРОКА СТРОЧНОЙ СТРОЧКИ")), })); вернуть результаты.failed() + results.errors(); } app.cpp
#include #include #include "utils.h" использование пространства имен std; int main(int argc, char* argv[]) { string original = "ЭТО НОРМАЛЬНАЯ СТРОКА."; cout
Я получаю две разные ошибки в зависимости от того, какую цель я создаю. Я могу собрать //:utils и //:utils_test, но не //:app. Я не могу запустить тесты после их создания. У меня Mac m1, я использую bazel от homebrew и clang от xcode. Я пытаюсь использовать цели сборки из включенного файла BUILD в icu. Сначала я попытался создать свой собственный файл icu.BUILD, но не смог включить файлы в каталог icu/source/common, поэтому просто использовал их. Кажется немного странным, что в одном файле пропущено больше символов, чем в другом.
Это ошибка, которую я получаю при попытке запустить bazel test //:utils_test.
ИНФОРМАЦИЯ: Из тестирования //:utils_test: ==================== Тестовый вывод для //:utils_test: dyld[15553]: символ не найден в плоском пространстве имен '__ZN6icu_738ByteSink15GetAppendBufferEiiPciPi' =============================================== ============================= Цель //:utils_test актуальная: базель-bin/utils_test ИНФОРМАЦИЯ: Затраченное время: 0,275 с, критический путь: 0,20 с. ИНФОРМАЦИЯ: 2 процесса: 2 дарвин-песочницы. ИНФОРМАЦИЯ: сборка завершена, 1 тест ПРОЙДЕН, всего 2 действия. //:utils_test завершился неудачно через 0,1 с. Это ошибка, которую я получаю при попытке запустить bazel build //:app.
ОШИБКА: /Users/default/Projects/icu-demo/BUILD:10:10: Ошибка связывания приложения: (Выход 1): Ошибка cc_wrapper.sh: ошибка при выполнении команды (из целевого //:приложения) external/local_config_cc/cc_wrapper.sh @bazel-out/darwin_arm64-fastbuild/bin/app-2.params Используйте --sandbox_debug, чтобы просмотреть подробные сообщения из песочницы и сохранить корень сборки песочницы для отладки. Неопределенные символы для архитектуры Arm64: "icu_73::UnicodeString::toLower()", ссылка на: ToLower(std::__1::basic_string const&) в libutils.a(utils.o) «icu_73::ByteSink::GetAppendBuffer(int, int, char*, int, int*)», ссылка на: vtable для icu_73::StringByteSink в libutils.a(utils.o) "icu_73::ByteSink::Flush()", ссылка на: vtable для icu_73::StringByteSink в libutils.a(utils.o) "icu_73::ByteSink::~ByteSink()", ссылка на: icu_73::StringByteSink::StringByteSink(std::__1::basic_string< char, std::__1::char_traits, std::__1::allocator>*, int) в libutils.a(utils.o) icu_73::StringByteSink::~StringByteSink() в libutils.a(utils .о) «typeinfo для icu_73::ByteSink», ссылка на: typeinfo для icu_73::StringByteSink в libutils.a(utils.o) «vtable для icu_73::ByteSink», ссылка на которую: icu_73::ByteSink::ByteSink() в libutils.a(utils.o) ПРИМЕЧАНИЕ. Отсутствие виртуальной таблицы обычно означает, что первая невстроенная виртуальная функция-член не имеет определения. ld: символы не найдены для архитектуры Arm64 clang: ошибка: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов) Ошибка в дочернем процессе «/usr/bin/xcrun». 1 Цель //: приложение не удалось собрать. Используйте --verbose_failures, чтобы просмотреть командные строки неудачных шагов сборки. ИНФОРМАЦИЯ: Затраченное время: 0,168 с, критический путь: 0,11 с. ИНФО: 2 процесса: 2 внутренних. ОШИБКА: сборка НЕ завершена успешно. РАБОЧЕЕ ОБЛАСТЬ
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( имя = "ИКУ", sha256 = "a457431de164b4aa7eca00ed134d00dfbf88a77c6986a10ae7774fc076bb8c45", Strip_prefix = "ИКУ", urls = ["https://github.com/unicode-org/icu/rele ... _1-src.tgz"], ) http_archive( имя = "крошечный тест", sha256 = "71f366e680606e18268e6b9673a65c44c9e672f7356a61ffbcd3502c6a8eea0b", Strip_prefix = "TinyTest-460c9492d927689b9db7f28d8742705dc0bbee62", urls = ["https://github.com/headhunter45/TinyTes ... bbee62.zip"], ) СТРОИТЬ
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") cc_library( имя = "Утилиты", srcs = ["utils.cpp"], hdrs = ["utils.h"], deps = ["@icu//source/common:platform"], ) cc_binary( имя = "приложение", srcs = ["app.cpp"], deps = ["утилиты"], ) cc_test( имя = "utils_test", srcs = ["utils_test.cpp"], депс = [ "утилиты", "@tinytest", ], ) utils.h
#include std::string ToLower(const std::string& text); utils.cpp
#include "utils.h" #include #include "unicode/unistr.h" используя icu::UnicodeString; используя std::string; строка ToLower(const string& text) { UnicodeString ustr = UnicodeString::fromUTF8(текст); строковый результат; устр.toLower(); ustr.toUTF8String(результат); вернуть результат; } utils_test.cpp
#include "utils.h" #include #include #include "tinytest.h" использование пространства имен TinyTest; использование пространства имен std; int main(int argc, char* argv[]) { результаты TestResults; результаты += Execute_suite(make_test_suite( "ToLower(const std::string&)", ToLower, { make_test("должна получить пустую строку", (строка) "", make_tuple("")), make_test("должна получить ту же строку", (строка) "та же строка", make_tuple("та же строка")), make_test("должна получить строку в нижнем регистре", (строка) "строка в нижнем регистре", make_tuple("СТРОКА СТРОЧНОЙ СТРОЧКИ")), })); вернуть результаты.failed() + results.errors(); } app.cpp
#include #include #include "utils.h" использование пространства имен std; int main(int argc, char* argv[]) { string original = "ЭТО НОРМАЛЬНАЯ СТРОКА."; cout
Мобильная версия