来自静态cc_library依赖的符号如此缺失

时间:2015-09-29 13:58:28

标签: bazel

我如何告诉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标志感到非常不舒服,因为我将不得不支持不同的体系结构,并且我更愿意为体系结构设置路径,仅依赖于不同的库,而不是在每个继承的工件中重复它。

3 个答案:

答案 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的正确标志。