c-仅使用bazel从头创建共享库



我正在尝试从Google Differential Privacy框架创建一个.so文件,以将其导入另一个(非Bazel)项目。

C代码只是头文件。对于构建过程,他们使用bazel,所以我试图坚持这一点。我在StackOverflow上查看了各种解决方案。他们中的大多数人认为这应该奏效:

cc_binary(
name= "lib.so",
linkshared=1,
srcs=["header.h","src.c"],
deps=["//framwork:dependency1"],
)

然而,这似乎不适用于我的情况。我想这是因为我只有.h文件作为源。这就是我得到的:

cc_binary(
name= "lib.so",
linkshared=1,
srcs=[
"header1.h",
"header2.h", 
...],
deps=["//framwork:dependency1", ...],

)

当用这个编译时,会创建一个.so文件,但里面没有符号或代码。因此,我使用的cc_binary规则似乎存在问题。在cc_binary中使用linkstatic没有任何差异。

Bazel为上面的规则执行的gcc命令看起来像这样:

gcc -shared -o lib.so -Wl,-S -fuse,ld=gold -Wl,-no-as-needed -Wl,-z,relro,-z,now -Wl,--start-lib logging.pic.o -Wl,--end-lib -Wl,--start-lib hash.pic.o -Wl,--end-lib ... -pthread -pthread -pthread -lpthread -lm -lpthread -lm -lstdc++ -lm

有更多的.pic.o文件与--start-lib--end-lib一起插入,而不是点。不知怎么的,这个命令似乎是错误的,但我不知道如何修复它。

看看Bazel项目Github页面上的讨论,创建.so文件似乎是Bazel的弱点之一。

有人知道这里可能出了什么问题吗?使用cc_shared_library是否可以解决此问题?如果是,我将如何使用它?提前感谢!

我想做的似乎没有什么意义。我发现了这篇关于CMake中只有头的库的文章。由于没有c文件,因此无法创建任何对象文件。因此,无法创建.so文件。

正如在另一篇文章中所描述的,我将尝试创建一个.c文件,它只包括所有.h文件,以创建.so文件。

最新更新