2015-09-29 27 views
3

我如何告诉bazel链接预编译(静态)库?符号静态cc_library依赖关系如此缺失

我已引用现有的静态库项目(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)依赖。有没有什么办法可以自动做到这一点?我已经尝试了评论* 1的参数,但是这没有帮助。

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

+0

您是否收到错误链接或您是否尝试发布自包含的库? – kristina

+0

我在构建过程中没有收到任何错误,但是我希望静态库(xy)中的符号包含在myxylib中。这适用于如果我将“-Lexternal/xy/x86_64 -lxy”添加到linkopts,但由于路径是依赖于平台的,我宁愿拥有一些bazel标志或类似的东西,使bazel根据它所依赖的依赖信息自动追加它。 libxy.a文件的位置已经在cc_library(xy)的srcs参数中给出,所以我不应该在cc_library(myxylib) – Jan

回答

3

cc_library不链接到它的依赖关系,直到它合并到cc_binary(所有内容都将链接到cc_binary而不必指定它)。

有没有一种优雅的方式来强制它将所有东西链接到一个cc_library。您可以使用genrule$location,因此您无需指定特定的体系结构。如果这是您希望看到我们添加的内容,请随时致电file an feature request

+0

的定义中重复自己感谢信息,我提交了一个功能请求( https://github.com/bazelbuild/bazel/issues/492)。同时我会用genrule和$ location来尝试它 – Jan

3

使用cc_binary代替cc_library改良linkopts(-shared)和名称( “LIB myxylib 。所以”):

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

...似乎是有用的作为一个解决方法,只要因为人们很乐意将所有的东西都链接到二进制文件中,而不需要特别的控这还包括clib版本绑定。

1

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