首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将CMake包与bazel cmake_external链接起来

将CMake包与bazel cmake_external链接起来
EN

Stack Overflow用户
提问于 2021-02-25 02:41:29
回答 1查看 2.8K关注 0票数 0

要将py手电筒c++库与CMake链接起来,您确实需要使用find_package(Torch REQUIRED)并使用

代码语言:javascript
运行
复制
-DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch

您可以在这里下载源代码:https://download.pytorch.org/libtorch/nightly/cpu/libtorch-shared-with-deps-latest.zip CMake教程在这里:https://pytorch.org/cppdocs/installing.html

我的WORKSPACE中有以下内容

代码语言:javascript
运行
复制
new_local_repository(
    name = "torch",
    build_file_content = all_content,
    path = "third_party/libtorch",
)

这个在我的BUILD

代码语言:javascript
运行
复制
cmake_external(
    name = "torch",
    cache_entries = {
        "CMAKE_PREFIX_PATH": "/home/jackshi/projects/third_party/libtorch",
    },
    lib_source = "@torch//:all",
)

当我试图链接到它时,我得到了<dir> does not appear to contain CMakeList.txt --这是事实,但是,当您将它与find_package(Torch REQUIRED)链接时,不需要顶级CMakeList.txt。CMake在找TorchConfig.cmake。bazel可以在没有顶级CMakeList.txt的情况下为这个包创建一个目标吗?应该是在找TorchConfig.cmake对吧?

另外,当文件是远程的,通过CMAKE_PREFIX_PATH获取时,您是否使用~/.cache/bazel目录?

谢谢!

EN

Stack Overflow用户

回答已采纳

发布于 2021-02-25 19:34:01

您的链接(https://download.pytorch.org/libtorch/nightly/cpu/libtorch-shared-with-deps-latest.zip)不是源代码,而是完整编译的库。因此,没有必要使用CMake,因为它已经被编译了。

find_package是一个CMake特性,它使用搜索最常见的安装路径的算法查找编译的依赖项。您想要找到的库,即使在CMake中也不一定要复合。您不想在这里使用它,因为它是解决问题的一种CMake方法

您可以尝试三种方法:

  • 在Bazel中,您可以使用已经构建的库。要做到这一点,只需创建一个普通的cc_library规则,其中将编译好的库*.a添加为srcs
代码语言:javascript
运行
复制
cc_library(
    name = "torch",
    srcs = glob(["lib/*.so", "lib/*.a"]),
    hdrs = glob(["include/**/*.h", "include/**/*.h"]),
    includes = ["include"],
)

这种方法很糟糕,因为您无法控制这个库的构建过程。从源代码编译的越多,构建堆栈就越好、更健壮。

  • 您可以使用抄送,它将为您运行和执行CMake。见示例。这是一种很好的方法,因为除了调用CMake之外,没有其他方法了。
  • 我不知道你是怎么做你的研究的,但看起来像您的库完全支持Bazel。只需使用:
代码语言:javascript
运行
复制
# WORKSPACE file
 http_archive(
      name = "pytorch",
      urls = ["https://github.com/pytorch/pytorch/archive/v1.7.1.tar.gz"],
      strip_prefix  = "pytorch-1.7.1",
  )

# and then in your BUILD file

cc_binary(
  name = "my_supper_binary"
  srcs = ["main.cpp"],
  deps = ["@pytorch//:torch"],
)

另外,当文件是远程的,通过CMAKE_PREFIX_PATH获取时,您是否使用~/..cache/bazel目录?

不,对于每个操作,Bazel使用一个叫做沙箱的特性来设置一个所需的环境。当您为您的工作区定义BUILD文件(例如,http_archive )时,所有所需的依赖项都会出现,您不应该关心它,因为该位置是在操作完成后移除的。使用适当的沙箱实现,您甚至无法读取/home/jackshi/projects/third_party/libtorch,因为该路径不在您的deps中。Bazel对此非常认真,因为无法跟踪这种鬼鬼祟祟的依赖关系,因此您可以在这里更改一些内容,而且Bazel不会重新编译目标。

但是,有时需要向cmake_external添加一些依赖项。使用rules_foreign_cc,您可以这样做:

代码语言:javascript
运行
复制
configure_make(
    name = "apr",
    lib_source = "@apr//:all",
    shared_libraries = ["libapr-1.so"],
    static_libraries = ["libapr-1.a"],
)

configure_make(
    name = "apr_util",
    configure_options = [
        "--with-apr=$$EXT_BUILD_DEPS$$/apr",
    ],
    lib_source = "@apr_util//:all",
    shared_libraries = ["libaprutil-1.so"],
    static_libraries = ["libaprutil-1.a"],
    deps = [":apr"],
)

这是一个自动工具示例,但并不重要。apr_util目标依赖于apr。因此,在apr_util构建期间,apr构建工件将在$$EXT_BUILD_DEPS$$/apr中可用。该路径是专为该特定构建而创建的,稍后将被擦除。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66361626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档