要将py手电筒c++库与CMake链接起来,您确实需要使用find_package(Torch REQUIRED)
并使用
-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
中有以下内容
new_local_repository(
name = "torch",
build_file_content = all_content,
path = "third_party/libtorch",
)
这个在我的BUILD
里
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
目录?
谢谢!
发布于 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方法
您可以尝试三种方法:
cc_library
规则,其中将编译好的库*.a
添加为srcs
。cc_library(
name = "torch",
srcs = glob(["lib/*.so", "lib/*.a"]),
hdrs = glob(["include/**/*.h", "include/**/*.h"]),
includes = ["include"],
)
这种方法很糟糕,因为您无法控制这个库的构建过程。从源代码编译的越多,构建堆栈就越好、更健壮。
# 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,您可以这样做:
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
中可用。该路径是专为该特定构建而创建的,稍后将被擦除。
https://stackoverflow.com/questions/66361626
复制相似问题