我有以下问题。我有两个共享库(使用 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"],
)
您多次将
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 了解为什么这是必要的。