0

免责声明:我是构建/make/packages/cmake 的菜鸟。
我的目标:xtensor-blas在 C++ 中使用库
我的环境: Win10 x64,CLion2021
我的问题:无法编译最简单的示例。关于项目依赖关系的某事。
我试过:
1)使用我可以谷歌搜索的每个教程手动下载和编译openBLAST - 总是停在不同的问题上。要么我没有“nmake”,要么由于某种原因构建失败,或者我得到“未定义的引用”等 - 我已经不知所措了几天。一步一步的演练将不胜感激。
2)我得到的最接近的是使用 anaconda conda install -c conda-forge openblas,然后将“包含”目录从xtl,复制粘贴到我的项目中xtensorxtensor-blas

cmake_minimum_required(VERSION 3.19)
project(tstxtensor3)

set(CMAKE_CXX_STANDARD 20)

add_executable(tstxtensor3 main.cpp)

include_directories(.)

add_definitions(-DHAVE_CBLAS=1)

set(OpenBLAS_DIR c:/Users/pruglo/anaconda3/envs/evn/Library/share/cmake/OpenBLAS/)
find_package(OpenBLAS REQUIRED)

if (OpenBLAS_FOUND)
    include_directories(${OpenBLAS_INCLUDE_DIRS})
    target_link_libraries(tstxtensor3 c:/Users/pruglo/anaconda3/envs/evn/Library/lib/openblas.lib ${OpenBLAS_LIBRARY})
else ()
    message("OpenBLAS NOT FOUND!")
endif ()

Cmake 加载成功,并且OpenBLAS_FOUNDtrue. 但是当我编译我的 cpp 时,我得到error while loading shared libraries: openblas.dll: cannot open shared object file: No such file or directory Process finished with exit code 127
Note: OpenBLAS_INCLUDE_DIRSexpands to c:/Users/pruglo/anaconda3/envs/evn/Library/include/openblasand OpenBLAS_LIBRARYexpands toc:/Users/pruglo/anaconda3/envs/evn/Library/bin/openblas.dll


额外问题

  • 我需要 LAPACK 或其他东西xtensor-blas吗?
  • 我可以便携式构建我的项目,这样我就不需要为我开发的每台电脑安装所有东西吗?
4

1 回答 1

1

免责声明:我远非 Windows 专家(我只是在持续集成中使用它进行测试)。

您应该能够使用xtensor-blas提供的目标。所以应该可以做的是(在任何平台上):

cmake_minimum_required(VERSION 3.1)

set(CMAKE_BUILD_TYPE Release)

project(myexec)
find_package(xtensor)
find_package(xtensor-blas)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} xtensor xtensor-blas)

既然您谈论conda,那确实是我认为最简单并且适用于所有平台的方法。我真的只需要做

conda install -c conda-forge cmake xtensor xtensor-blas

(在我加载的环境中)。

这里可能有一个陷阱:请注意,我使用了来自conda的CMake。可能是它为conda配置了正确的路径(但我不太确定是否诚实)。

为了完整起见,我认为您可以使用(从您的源目录,加载您的conda环境):

conda install -c conda-forge ninja
cmake -G "NMake Makefiles" -Bbuild
cd build
nmake

为了独立,我使用文档中的示例进行了测试:

#include <xtensor.hpp>
#include <xtensor-blas/xlinalg.hpp>

int main()
{
    xt::xarray<double> a = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    auto d = xt::linalg::det(a);
    std::cout << d << std::endl;  // 6.661338e-16
    return 0;
}
于 2021-03-31T08:28:53.400 回答