Bazel如何构建一个链接预先构建的外部库的简单应用程序



使用Bazel2.2,我如何根据外部库进行构建,例如,在我的情况下,我想根据boost(为MS VC++2019预构建(进行构建,问题是这在Bazel中可能吗?

假设提升库的本地路径是c: \boost_1_72_0,其中有三个文件夹bin、include和lib

如果是,如何告诉编译器和链接器:

  • 包含文件的路径
  • lib文件的路径
  • 将特定于库的.lib文件提升到链接(即。boost_context-vc142-mt-x64-1_72.lib(

我试过下面的cc_library,但不幸的是它不起作用。

cc_library(
    name = "boost",
    srcs = glob(["*.lib"]),
    hdrs = glob(["*.hpp", "*.*", "*"] + ["boost/*.hpp"] + ["boost/*/*.hpp"]),
    includes = [
        "C:/boost_1_72_0/include"
    ],
    linkopts = ["-pthread","-LC:/boost_1_72_0/lib"],
    visibility = ["//visibility:public"],
)
cc_binary(
    name = "hello-bazel",
    srcs = ["main.cpp", "SomeClass.h", "SomeClass.cpp"],
    deps = [":boost"],
)

我终于弄明白了。事实上,它与CMake或任何其他构建工具都非常不同,以防你来自CMake背景(就像我一样(。

首先,我假设您确实有一个预构建的c/c++外部库,即具有include、bin和lib文件夹结构的c:\boost,还假设您确实拥有两个更重要的东西:

  • 文件夹,该文件夹承载WORKSPACE主文件
  • BUILD引用主应用程序(包(的文件

主构建文件应该是:

cc_binary(
    name = "hello-bazel",
    srcs = ["main.cpp", "SomeClass.h", "SomeClass.cpp"],
    deps = ["@boost//:boost_172_shared"],
)

这次我们需要添加另一个生成文件,将其命名为build.boost将子文件夹放在应用程序的主文件夹中,即hello-bazel/dependency,以便看起来如下:

hello-bazel->示例文件夹

  • WORKSPACE->文件
  • 主->文件夹,该文件夹承载BUILD、main.cpp、someclass.h和someclass.cpp
  • dependent->文件夹,该文件夹承载BUILD.boost

添加BUILD.boost,如上所述,在子文件夹依赖项中包括:

cc_library(
    name = "boost_172_shared",
    srcs = glob(["lib/*.lib"]),
    hdrs = glob( ["include/boost/*.hpp"] +    ["include/boost/*.h"] + 
                 ["include/boost/**/*.hpp"] + ["include/boost/**/*.h"] + 
                 ["include/boost/**/**/**/*.hpp"] + ["include/boost/**/**/**/*.h"] + 
                 ["include/boost/**/**/*.hpp"] +    ["include/boost/**/**/*.h"] ),
    strip_include_prefix = "include/",
    visibility = ["//visibility:public"]
)

我们需要编辑您的WORKSPACE文件,如上所示,以包括以下内容:

new_local_repository(
    name = "boost",
    path = "C:\Development\Libraries\boost\",
    build_file = "dependency\BUILD.boost",
)

正如–Ondrej K在评论中提到的,上面的new_local_pository是指向外部库的关键。

最新更新