我有一个基于Bazel的C++项目,它使用protos和proto_library
规则。
build:android_arm64 --cpu=arm64-v8a
build:android_arm64 --fat_apk_cpu=arm64-v8a
build:android_arm64 --crosstool_top=//external:android/crosstool
build:android_arm64 --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
protobuf构建文件有一个android配置,该配置使用相同的crosstool_top值,该值控制是否将pthread与-lpthread
链接(因为libpthread.so在android上不存在)。因此应该启用android配置。
如果使用bazel build:my_project_cc_binary--config=android_arm64
构建,则在my_project_binary的最后一个链接步骤中会出现关于ld:nant find-lpthread
的错误。因此,//conditions:default
配置用于protoc
主机二进制的linkopts被添加到android目标的linkopts中。
据我所知,我的android cc_binary应该与libprotobuf链接,它是linkopts。它不应该与Protoc的linkopts链接,即使它包含在依赖关系图中,因为主机需要构建并运行它来编译Protos。
为什么来自主机规则的链接会出现在我的cc_binary目标的链接中?需要构建主机工具的android目标不支持cc_binary吗?我也很好奇android_binary是否以某种方式解决了这个问题,但无法看到它是如何定义的。
# com_google_protobuf/BUILD
config_setting(
name = "android",
values = {
"crosstool_top": "//external:android/crosstool",
},
)
...
# Android and MSVC builds do not need to link in a separate pthread library.
LINK_OPTS = select({
":android": [],
":android-libcpp": [],
":android-gnu-libstdcpp": [],
":msvc": [
# Suppress linker warnings about files with no symbols defined.
"-ignore:4221",
],
"//conditions:default": [
"-lpthread",
"-lm",
],
})
...
cc_binary(
name = "protoc",
srcs = ["src/google/protobuf/compiler/main.cc"],
linkopts = LINK_OPTS,
visibility = ["//visibility:public"],
deps = [":protoc_lib"],
)
我已经解决了这个问题。这里的问题不是主机与protoc/protobuf的链接,而是与另一个无条件使用-lpthread
的库(gflags)有关。添加protobuf使用的相同的android config和select语句解决了这个问题(PR)。使用一个不存在的-lnotaRealLibrary
的问题是protoc的链接器错误,而不是我的目标可执行文件。
为了便于描述调试过程,我在自动生成的bazel-myreponame/external
目录的build
文件和.bzl
文件中搜索了-lpthread
。(一开始我只想搜索构建文件,它错过了这个库)
问题内容: 我已经编写了一个简单的httprequest / response代码,但出现以下错误。我在类路径中引用了httpclient,httpcore,common-codecs和common- logging。我对Java非常陌生,不知道这里发生了什么。请帮我。 码: 错误: 问题答案: 该错误消息有点误导。您提供的值不代表完整的URI 它缺少协议。 只需提供完整的URI
我一直试图使用Ansible Playbook将主机名添加到我的主机文件中。我的Ansible播放如下所示,我的主机文件位于: Playbook成功执行,但新主机名没有添加到Ansible hosts文件中。有人能帮我吗?
我们在应用程序中使用docker compose,但不熟悉应用程序的这一部分。在运行<code>docker Cosme up--build<code>后,我们遇到了此错误:
挂载主机目录 挂载一个主机目录作为数据卷 使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。 $ docker run -d -P \ --name web \ # -v /src/webapp:/opt/webapp \ --mount type=bind,source=/src/webapp,target=/opt/webapp \ training/
Bazel 是一款快速、可靠地构建和测试任何规模的软件。 Bazel 仅重建必要的内容。借助高级的本地和分布式缓存,优化的依赖关系分析和并行执行,您可以获得快速而增量的构建。 构建和测试Java、C++、Android、iOS、Go和其他各种语言平台。Bazel可以在Windows、macOS和Linux上运行。 Bazel帮助你扩展你的组织、代码库和持续集成系统。它可以处理任何规模的代码库,在多