簡體   English   中英

使用 bazel 如何構建和安裝依賴於 protobuf 的 C++ 庫?

[英]Using bazel how does one build and install a c++ library that depends on protobuf?

我正在構建一個具有以下依賴項的 32 位 C++ 庫

#include <google/protobuf/message.h>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/arena.h>
#include <google/protobuf/compiler/importer.h>
#include <google/protobuf/dynamic_message.h>

將以下內容作為 BUILD.bazel 文件

COPTS = select({
    "//conditions:default": [ 
        "-Wall",
        "-m32",
        "-fPIC"
    ],
})

LINK_OPTS = select({
    "//conditions:default": [
        "-m32",
        "-fPIC",
        # "-lpthread",
        # "-lprotobuf",
        # "-pthread"
    ],
})

.. proto libraries ...

cc_library(
    name = "proto_example", 
    srcs = [
        ....
    ],
    hdrs = glob([
        ...
    ]),
    copts = COPTS,
    includes = ["src/", "./"],
    linkopts = LINK_OPTS,
    visibility = ["//visibility:public"],
    deps = [
      "@com_google_protobuf//:protobuf",
      ":cpp_examples_proto"
    ]
)

以下是 WORKSPACE 文件:

workspace(name = "protobufkdb")

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

http_archive(
    name = "rules_proto_grpc",
    sha256 = "7954abbb6898830cd10ac9714fbcacf092299fda00ed2baf781172f545120419",
    strip_prefix = "rules_proto_grpc-3.1.1",
    urls = ["https://github.com/rules-proto-grpc/rules_proto_grpc/archive/3.1.1.tar.gz"],
)

load("@rules_proto_grpc//:repositories.bzl", "rules_proto_grpc_toolchains", "rules_proto_grpc_repos")
rules_proto_grpc_toolchains()
rules_proto_grpc_repos()

load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
rules_proto_dependencies()
rules_proto_toolchains()

load("@rules_proto_grpc//cpp:repositories.bzl", rules_proto_grpc_cpp_repos = "cpp_repos")
rules_proto_grpc_cpp_repos()

# C++
load("@rules_proto_grpc//cpp:repositories.bzl", "cpp_repos")
cpp_repos()

load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
grpc_deps()

http_archive(
    name = "com_google_protobuf",
    sha256 = "c6003e1d2e7fefa78a3039f19f383b4f3a61e81be8c19356f85b6461998ad3db",
    strip_prefix = "protobuf-3.17.3",
    urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.17.3.tar.gz"],
)

但是,當我在給定的客戶端中包含/嵌入庫時,會出現以下錯誤:

undefined symbol: _ZTIN6google8protobuf8compiler23MultiFileErrorCollectorE

以下是顯而易見的:

c++filt_ZTIN6google8protobuf8compiler23MultiFileErrorCollectorE

google::protobuf::compiler::MultiFileErrorCollector 的類型信息

我已經嘗試通過在鏈接 opts 中取消注釋 -lprotobuf 來鏈接 protobuf?:導致/usr/bin/ld.gold: error: cannot find -lprotobuf在構建過程中/usr/bin/ld.gold: error: cannot find -lprotobuf

這里的問題是 protobuf 在 64 位系統上構建為 32 個庫,並且正在使用系統 protobuf 安裝,即apt-get install protobuf etc..

這是我第一次使用 bazel。 因此,與可以使用 DCMAKE_PREFIX_PATH 指定 protobuf 的安裝目錄的 cmake 不同。 應該如何將 32 位 C++ 庫與 protobuf 鏈接起來,以便可以在不拋出符號錯誤的情況下使用它?

任何人都可以向我提供有關如何使其工作的一些見解嗎? 謝謝

使用--copt=-m32 --linkopt=-m32 (在命令行上)而不是coptslinkopts

deps有 protobuf 是告訴 bazel 鏈接它的原因。 如果要進行 32 位構建,則在編譯所有內容時都需要使用-m32 目前您只有在編譯和鏈接目標時才擁有它,因此它試圖鏈接到 64 位 protobuf。

如果您不想每次構建時都鍵入這些命令行標志,請將build --copt=-m32 --linkopt=-m32放在 WORKSPACE 旁邊的.bazelrc 文件中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM