如何通过 Bazel 使用 C++ 共享库

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

我有以下问题。我有两个共享库(使用 cc_binary)和一个可执行文件。 如果我运行 main,我希望在 printvs 中显示相同的值,而与我调用它的位置无关。但我从 main 调用时得到 0。我不明白为什么,因为 vs() 符号应该位于 lib1.so 中,它应该共享给每个消费者。有人可以解释一下出了什么问题吗?

lib1.h

#pragma once
#include <vector>

struct Services
{
    static std::vector<int> &vs();
    static void printvs();
};

lib1.cc

#include "lib1.h"

#include <iostream>

std::vector<int>& Services::vs()
{
    static std::vector<int> v;
    return v;
}

void Services::printvs()
{
    std::cout << Services::vs().size() << std::endl;
}

lib2.cc

#include "lib1.h"

static bool init()
{
    Services::vs().push_back(1);
    Services::vs().push_back(2);
    Services::printvs();
    return true;
}

[[maybe_unused]] bool i = init();

main.cc #include“lib1.h”

int main()
{
    Services::printvs();
}

构建.bazel

cc_library(
    name = "lib1_lib",
    srcs = ["lib1.cc"],
    hdrs = ["lib1.h"],
    visibility = ["//visibility:public"],
)

cc_binary(
    name = "lib1",
    srcs = ["lib1_lib"],
    visibility = ["//visibility:public"],
    linkshared = 1,
)

cc_library(
    name = "lib2_lib",
    srcs = ["lib2.cc"],
    deps = ["lib1_lib"],
    visibility = ["//visibility:public"],
)

cc_binary(
    name = "lib2",
    srcs = ["lib2_lib"],
    visibility = ["//visibility:public"],
    linkshared = 1,
)

cc_binary(
    name = "main",
    srcs = ["main.cc", ":lib2", ":lib1"],
    deps = [":lib1_lib"],
)
c++ linux gcc bazel
1个回答
0
投票

您多次将

lib1.cc
链接到二进制文件中,由于您遇到的原因,这通常是一个坏主意。请改用 cc_shared_library,它会检查这一点并告诉您。

cc_library(
    name = "lib1_lib",
    srcs = ["lib1.cc"],
    hdrs = ["lib1.h"],
    visibility = ["//visibility:public"],
)

cc_shared_library(
    name = "lib1",
    deps = ["lib1_lib"],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "lib2_lib",
    srcs = ["lib2.cc"],
    deps = ["lib1_lib"],
    visibility = ["//visibility:public"],
)

cc_shared_library(
    name = "lib2",
    deps = ["lib2_lib"],
    dynamic_deps = ["lib2"],
    visibility = ["//visibility:public"],
)

cc_binary(
    name = "main",
    srcs = ["main.cc"],
    deps = [":lib1_lib"],
    dynamic_deps = ["lib1", "lib2"],
)

注意

lib2
dynamic_deps
中多余的
main
。请参阅 bazelbuild/bazel#21819 了解为什么这是必要的。

© www.soinside.com 2019 - 2024. All rights reserved.