3

我如何告诉 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 不会自动为依赖。有没有办法让 bazel 自动执行此操作?我已经尝试了注释 *1 中的参数,但这没有帮助。

我对手动设置 -L 和 -l 标志感到非常不舒服,因为我将不得不支持不同的架构,并且我更愿意为依赖于架构的不同库设置路径,而不是在每个继承的工件中重复它。

4

3 回答 3

4

使用 cc_binary 而不是 cc_library 和修改的 linkopts (-shared) 和 name(" lib myxylib .so "):

cc_binary(
  name="libmyxy.so",
  hdrs=["myxylib.h"],
  srcs=["myxylib.c"], 
  visibility=["//visibility:public"],
  deps=["@xy//:xy"],
  linkopts = ["-shared"],
)

... 似乎是一种有用的解决方法,只要一个人乐于在没有特定控制的情况下将所有内容链接到二进制文件中。这还包括一个 clib 版本绑定。

于 2015-10-05T06:56:01.930 回答
3

cc_library在组合成 a 之前不会链接其依赖项cc_binary(所有内容都将链接到 ,cc_binary而无需您指定它)。

没有一种优雅的方式可以强制它将所有内容链接到cc_library. 您可以使用genrulewith $location,因此您无需指定特定的架构。或者,如果您希望我们添加此功能,请随时提交功能请求。

于 2015-10-01T14:33:59.037 回答
1

就像 Jan 提到的那样,您可以使用 cc_binary() 创建一个库。您应该使用 linksshared=1 属性,以便 Bazel 发出正确的标志来生成 DSO。

于 2015-10-06T10:36:13.557 回答