根据我构建的目标,我收到两个不同的错误。我可以构建 //: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;
}
也许,您已经解决了这个问题,但也许这对于其他遇到这个问题的人来说会有用。 要点是深入研究内部依赖的构建系统(在我们的例子中是 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",
],
)