我如何告诉bazel链接预编译(静态)库?
我引用了一个现有的静态库项目(xy.BUILD):
cc_library(
name="xy",
srcs=["lib/x86_64/libxy.a"],
hdrs=["include/xy.h"],
includes=["include"],
#linkstatic=True, <---- *1
#alwayslink=True,
visibility=["//visibility:public"],
)
在另一个项目(BUILD)中:
cc_library(
name="myxylib",
hdrs=["myxylib.h"],
srcs=["myxylib.c"],
visibility=["//visibility:public"],
deps=["@xy//:xy"],
linkopts = ["-pthread",
#"-Lexternal/xy/lib/x86_64/", <---- *2
#"-lxy",
#"-z defs"
],
)
...作为外部依赖项(WORKSPACE中的new_local_repository)。我可以使用头文件并将代码编译为.so库,但是共享对象中缺少静态库中的符号,因为bazel没有自动设置-L和-l标志(请参阅注释* 2)依赖。有没有办法让forca bazel自动执行此操作?我已经在评论* 1中尝试了参数,但这没有帮助。
我手动设置-L和-l标志感到非常不舒服,因为我将不得不支持不同的体系结构,并且我更愿意为体系结构设置路径,仅依赖于不同的库,而不是在每个继承的工件中重复它。
答案 0 :(得分:3)
cc_library
在其依赖关系中没有链接,直到它被合并为cc_binary
(所有内容都会链接到cc_binary
而无需您指定) 。
没有一种优雅的方法可以强制它将所有内容链接到cc_library
。您可以将genrule
与$location一起使用,这样您就不需要指定特定的体系结构。或者,如果您希望我们添加此内容,请随时file an feature request。
答案 1 :(得分:3)
使用cc_binary代替cc_library,修改了linkopts(-shared)和名称(&#34; lib myxylib .so &#34;):
cc_binary(
name="libmyxy.so",
hdrs=["myxylib.h"],
srcs=["myxylib.c"],
visibility=["//visibility:public"],
deps=["@xy//:xy"],
linkopts = ["-shared"],
)
...似乎有用作为一种解决方法,只要有人乐于将所有内容链接到二进制文件而无需特定控制。这还包括一个clib版本绑定。
答案 2 :(得分:1)
与Jan提到的一样,您可以使用cc_binary()来创建库。您应该使用linkshared = 1属性,以便Bazel发出生成DSO的正确标志。