C++ Bazel如何构建链接预构建外部库的简单应用程序
使用Bazel2.2,我如何根据外部库进行构建,例如,在我的例子中,我想根据boost(为MS VC++2019预构建)进行构建,问题是在Bazel中这是否可能 考虑到boost库的本地路径是 c:\boost\u 1\u 72\u 0,其中有三个文件夹bin、include和lib 如果是,如何告知编译器和链接器: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_库,
- 包含文件的路径
- lib文件的路径
- boost特定于库的.lib文件以链接(即。 boost_context-vc142-mt-x64-1_72.lib)
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的文件夹
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目标时,它出现了故障。我的帖子在这里:。如果你有任何想法,请让我知道!