如何让Bazel作为外部依赖链接到ICU?

问题描述 投票:0回答:1

根据我构建的目标,我收到两个不同的错误。我可以构建 //:utils 和 //:utils_test,但不能构建 //:app。构建后我无法运行测试。我使用的是 m1 mac,我使用的是 homebrew 中的 bazel,以及 xcode 中的 clang。我正在尝试使用 icu 中包含的 BUILD 文件中的构建目标。我尝试创建自己的 icu.BUILD 文件来首先使用,但无法包含 icu/source/common 下的文件,所以我只使用了他们的文件。我在一个文件中丢失的符号多于另一个文件中的符号,这似乎有点奇怪。

这是我尝试运行时遇到的错误

bazel test //:utils_test

INFO: From Testing //:utils_test:
==================== Test output for //:utils_test:
dyld[15553]: symbol not found in flat namespace '__ZN6icu_738ByteSink15GetAppendBufferEiiPciPi'
================================================================================
Target //:utils_test up-to-date:
  bazel-bin/utils_test
INFO: Elapsed time: 0.275s, Critical Path: 0.20s
INFO: 2 processes: 2 darwin-sandbox.
INFO: Build completed, 1 test FAILED, 2 total actions
//:utils_test                                                            FAILED in 0.1s

这是我尝试运行时遇到的错误

bazel build //:app

ERROR: /Users/default/Projects/icu-demo/BUILD:10:10: Linking app failed: (Exit 1): cc_wrapper.sh failed: error executing command (from target //:app) external/local_config_cc/cc_wrapper.sh @bazel-out/darwin_arm64-fastbuild/bin/app-2.params

Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging
Undefined symbols for architecture arm64:
  "icu_73::UnicodeString::toLower()", referenced from:
      ToLower(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) in libutils.a(utils.o)
  "icu_73::ByteSink::GetAppendBuffer(int, int, char*, int, int*)", referenced from:
      vtable for icu_73::StringByteSink<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>> in libutils.a(utils.o)
  "icu_73::ByteSink::Flush()", referenced from:
      vtable for icu_73::StringByteSink<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>> in libutils.a(utils.o)
  "icu_73::ByteSink::~ByteSink()", referenced from:
      icu_73::StringByteSink<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>::StringByteSink(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>*, int) in libutils.a(utils.o)
      icu_73::StringByteSink<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>::~StringByteSink() in libutils.a(utils.o)
  "typeinfo for icu_73::ByteSink", referenced from:
      typeinfo for icu_73::StringByteSink<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>> in libutils.a(utils.o)
  "vtable for icu_73::ByteSink", referenced from:
      icu_73::ByteSink::ByteSink() in libutils.a(utils.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Error in child process '/usr/bin/xcrun'. 1
Target //:app failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 0.168s, Critical Path: 0.11s
INFO: 2 processes: 2 internal.
FAILED: Build did NOT complete successfully

工作空间

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "icu",
    sha256 = "a457431de164b4aa7eca00ed134d00dfbf88a77c6986a10ae7774fc076bb8c45",
    strip_prefix = "icu",
    urls = ["https://github.com/unicode-org/icu/releases/download/release-73-1/icu4c-73_1-src.tgz"],
)

http_archive(
    name = "tinytest",
    sha256 = "71f366e680606e18268e6b9673a65c44c9e672f7356a61ffbcd3502c6a8eea0b",
    strip_prefix = "TinyTest-460c9492d927689b9db7f28d8742705dc0bbee62",
    urls = ["https://github.com/headhunter45/TinyTest/archive/460c9492d927689b9db7f28d8742705dc0bbee62.zip"],
)

建造

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

cc_library(
    name = "utils",
    srcs = ["utils.cpp"],
    hdrs = ["utils.h"],
    deps = ["@icu//source/common:platform"],
)

cc_binary(
    name = "app",
    srcs = ["app.cpp"],
    deps = ["utils"],
)

cc_test(
    name = "utils_test",
    srcs = ["utils_test.cpp"],
    deps = [
        "utils",
        "@tinytest",
    ],
)

utils.h

#include <string>

std::string ToLower(const std::string& text);

utils.cpp

#include "utils.h"

#include <string>

#include "unicode/unistr.h"

using icu::UnicodeString;
using std::string;

string ToLower(const string& text) {
  UnicodeString ustr = UnicodeString::fromUTF8(text);
  string result;
  ustr.toLower();
  ustr.toUTF8String(result);
  return result;
}

utils_test.cpp

#include "utils.h"

#include <string>
#include <tuple>

#include "tinytest.h"

using namespace TinyTest;
using namespace std;

int main(int argc, char* argv[]) {
  TestResults results;

  results += execute_suite(make_test_suite(
      "ToLower(const std::string&)", ToLower,
      {
          make_test("should get an empty string", (string) "", make_tuple("")),
          make_test("should get the same string", (string) "the same string",
                    make_tuple("the same string")),
          make_test("should get a lowercase string",
                    (string) "a lowercase string",
                    make_tuple("A lOwErCaSe StRiNg")),
      }));

  return results.failed() + results.errors();
}

应用程序.cpp

#include <iostream>
#include <string>

#include "utils.h"

using namespace std;

int main(int argc, char* argv[]) {
  string original = "ThIs Is A nOrMaL sTrInG.";

  cout << "original:  " << original << endl;
  cout << "lowercase: " << ToLower(original) << endl;
  return 0;
}
c++ bazel icu
1个回答
0
投票

也许,您已经解决了这个问题,但也许这对于其他遇到这个问题的人来说会有用。 要点是深入研究内部依赖的构建系统(在我们的例子中是 icu)。他们不会针对不同的版本存档调整其配置(或者我还没有找到如何正确运行它)。考虑到,要运行您的应用程序,仅使用 icu 的“平台”是不够的。 我没有时间弄清楚我们到底需要什么,所以我指定了所有现有的目标。至少,它有效:)

工作空间:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "icu",
    strip_prefix = "icu-release-73-1",
    urls = ["https://github.com/unicode-org/icu/archive/refs/tags/release-73-1.zip"],
)

构建:

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

cc_library(
    name = "utils",
    srcs = ["utils.cpp"],
    hdrs = ["utils.h"],
    deps = [
        "@icu//icu4c/source/common:breakiterator",
"@icu//icu4c/source/common:bytesinkutil",
"@icu//icu4c/source/common:bytestream",
"@icu//icu4c/source/common:bytestrie",
"@icu//icu4c/source/common:bytestriebuilder",
"@icu//icu4c/source/common:canonical_iterator",
"@icu//icu4c/source/common:characterproperties",
"@icu//icu4c/source/common:chariter",
"@icu//icu4c/source/common:edits",
"@icu//icu4c/source/common:emojiprops",
"@icu//icu4c/source/common:errorcode",
"@icu//icu4c/source/common:filterednormalizer2",
"@icu//icu4c/source/common:hashtable",
"@icu//icu4c/source/common:headers",
"@icu//icu4c/source/common:icu_utility",
"@icu//icu4c/source/common:loadednormalizer2",
"@icu//icu4c/source/common:locale_display_names",
"@icu//icu4c/source/common:locresdata",
"@icu//icu4c/source/common:normalizer2",
"@icu//icu4c/source/common:normlzr",
"@icu//icu4c/source/common:parsepos",
"@icu//icu4c/source/common:patternprops",
"@icu//icu4c/source/common:platform",
"@icu//icu4c/source/common:propname",
"@icu//icu4c/source/common:propsvec",
"@icu//icu4c/source/common:resourcebundle",
"@icu//icu4c/source/common:schriter",
"@icu//icu4c/source/common:service_registration",
"@icu//icu4c/source/common:sort",
"@icu//icu4c/source/common:stringenumeration",
"@icu//icu4c/source/common:stringtriebuilder",
"@icu//icu4c/source/common:ubidi_props",
"@icu//icu4c/source/common:ucase",
"@icu//icu4c/source/common:uchar",
"@icu//icu4c/source/common:ucharstrie",
"@icu//icu4c/source/common:ucharstriebuilder",
"@icu//icu4c/source/common:ucharstrieiterator",
"@icu//icu4c/source/common:ucol_swp",
"@icu//icu4c/source/common:ucptrie",
"@icu//icu4c/source/common:udata",
"@icu//icu4c/source/common:uhash",
"@icu//icu4c/source/common:uiter",
"@icu//icu4c/source/common:ulist",
"@icu//icu4c/source/common:umutablecptrie",
"@icu//icu4c/source/common:unames",
"@icu//icu4c/source/common:unifiedcache",
"@icu//icu4c/source/common:uniset",
"@icu//icu4c/source/common:uniset_closure",
"@icu//icu4c/source/common:uniset_core",
"@icu//icu4c/source/common:uniset_props",
"@icu//icu4c/source/common:unistr_case",
"@icu//icu4c/source/common:unistr_case_locale",
"@icu//icu4c/source/common:unistr_titlecase_brkiter",
"@icu//icu4c/source/common:uprops",
"@icu//icu4c/source/common:uscript_props",
"@icu//icu4c/source/common:uset",
"@icu//icu4c/source/common:uset_props",
"@icu//icu4c/source/common:usetiter",
"@icu//icu4c/source/common:ustack",
"@icu//icu4c/source/common:ustr_titlecase_brkiter",
"@icu//icu4c/source/common:ustring_case",
"@icu//icu4c/source/common:ustring_case_locale",
"@icu//icu4c/source/common:utext",
"@icu//icu4c/source/common:utrie",
"@icu//icu4c/source/common:utrie2",
"@icu//icu4c/source/common:utrie2_builder",
"@icu//icu4c/source/common:utrie_swap",
"@icu//icu4c/source/common:utypes",
"@icu//icu4c/source/common:uvector",
"@icu//icu4c/source/common:uvector32",
"@icu//icu4c/source/common:uvector64",
"@icu//icu4c/source/i18n:collation",
"@icu//icu4c/source/i18n:collation_builder",
"@icu//icu4c/source/i18n:headers",
"@icu//icu4c/source/i18n:uclean_i18n",
"@icu//icu4c/source/stubdata:stubdata",
"@icu//icu4c/source/tools/gennorm2:gennorm2",
"@icu//icu4c/source/tools/toolutil:collationinfo",
"@icu//icu4c/source/tools/toolutil:denseranges",
"@icu//icu4c/source/tools/toolutil:filestrm",
"@icu//icu4c/source/tools/toolutil:ppucd",
"@icu//icu4c/source/tools/toolutil:toolutil",
"@icu//icu4c/source/tools/toolutil:unewdata",
"@icu//icu4c/source/tools/toolutil:uoptions",
"@icu//icu4c/source/tools/toolutil:uparse",
"@icu//icu4c/source/tools/toolutil:writesrc",
"@icu//tools/unicode/c/genprops:genprops",
"@icu//tools/unicode/c/genuca:genuca"
    ],
)

cc_binary(
    name = "app",
    srcs = ["app.cpp"],
    deps = [
        "utils"
    ]
)

cc_test(
    name = "utils_test",
    srcs = ["utils_test.cpp"],
    deps = [
        "utils",
        "@tinytest",
    ],
)
© www.soinside.com 2019 - 2024. All rights reserved.