当前位置: 首页 > 知识库问答 >
问题:

Bazel主机(x86 linux)linkopts面向目标(android)

樊烨烨
2023-03-14

我有一个基于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"],                             
)                                                                                                                                  
                                                                                

共有1个答案

戚阳
2023-03-14

我已经解决了这个问题。这里的问题不是主机与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帮助你扩展你的组织、代码库和持续集成系统。它可以处理任何规模的代码库,在多