C++ Bazel如何构建链接预构建外部库的简单应用程序

C++ Bazel如何构建链接预构建外部库的简单应用程序,c++,bazel,C++,Bazel,使用Bazel2.2,我如何根据外部库进行构建,例如,在我的例子中,我想根据boost(为MS VC++2019预构建)进行构建,问题是在Bazel中这是否可能 考虑到boost库的本地路径是 c:\boost\u 1\u 72\u 0,其中有三个文件夹bin、include和lib 如果是,如何告知编译器和链接器: 包含文件的路径 lib文件的路径 boost特定于库的.lib文件以链接(即。 boost_context-vc142-mt-x64-1_72.lib) 我试过下面的cc_库,

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

考虑到boost库的本地路径是 c:\boost\u 1\u 72\u 0,其中有三个文件夹bin、include和lib

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

  • 包含文件的路径
  • lib文件的路径
  • boost特定于库的.lib文件以链接(即。 boost_context-vc142-mt-x64-1_72.lib)
我试过下面的cc_库,但不幸的是它不起作用

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++外部库,即c:\boost,带有include、bin和lib文件夹结构,还假设您还有两个更重要的东西:

  • 存放主工作区文件的文件夹
  • 生成引用主应用程序(包)的文件
主生成文件应为:

cc_binary(
    name = "hello-bazel",
    srcs = ["main.cpp", "SomeClass.h", "SomeClass.cpp"],
    deps = ["@boost//:boost_172_shared"],
)
这次我们需要添加另一个构建文件,我们将其命名为build.boost 将子文件夹放入应用程序的主文件夹,即hello bazel/dependency,如下所示:

hello bazel->示例文件夹

  • 工作空间->文件
  • 主->存放构建、main.cpp、someclass.h和someclass.cpp的文件夹
  • 依赖项->托管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"]
)
我们需要如上所示编辑您的工作区文件,以包括以下内容:

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

上述新的\u本地\u存储库是指向您的外部库的关键,正如–Ondrej K在评论中提到的。

我不确定,您的外部库应该是
cc\u库
目标,并作为
dep
或?@OndrejK>之一添加到您的
主库
。是的,它应该作为dep添加到main target中,我的意思是,我希望您有一个外部依赖,对于您所说的内容,可能是通过它的声音,并且您使用它的
路径
属性和通过
构建文件[\u content]提供的
构建
在另一个
cc.*
规则中定义用于
deps
的cc_库。关于
VAR_PATH
的问题听起来有点可疑,也许实际上并不是你应该追求什么?TL;DR:与其问如何在bazel中编写cmake,不如多解释一下你的设置和你正在尝试做的事情。@OndrejK。这个怎么样,我已经重新表述了这个问题,希望它现在就清楚了!谢谢@OndrejK。是新的本地存储库解决了我的问题。我正试图做同样的事情,但由于某种原因,当我运行binray目标时,它出现了故障。我的帖子在这里:。如果你有任何想法,请让我知道!