0

我正在寻找pyembree使用 CMake for Windows 从源代码构建的帮助。GitHub 上列出了有关此问题历史的更多详细信息。刚刚删除了对 conda-forge 的 Windows 支持pyembree,因此非常感谢您提供任何帮助!

安装说明

系统

测试:

操作系统: Windows 10 x64 专业版,内部版本 1909 Python: 3.8.10

脚步

  1. 安装Microsoft Visual C++ 14.X 和 Windows 10 SDK。这些是构建cython代码所必需的。

注意: Microsoft Visual Studio 的版本与 Microsoft Visual C++ 的版本不同。Visual Studio 2015、2017 和 2019 都有 MSVCv14X 构建工具。在撰写本文时,安装 Visual Studio 2019 构建工具

MSVCv142 - VS 2019 C++ x64/x86 build toolsWindows 10 SDK (10.0.18362.0)

组件就足够了(Desktop development with C++如果安装 Visual Studio 2019,请选择工作负载)。

  1. 安装vcpkgC:\\vcpkg并将路径添加到您的System Environment Variables
C:
mkdir vcpkg
cd C:\\vcpkg
git clone https://github.com/Microsoft/vcpkg.git
bootstrap-vcpkg.bat
vcpkg integrate install
  1. 安装embree2 64-bit
vcpkg install embree2:x64-windows

注意: 迄今为止,pyembree 仍然依赖于 Embree 2,并且尚未针对 Embree 3 进行更新。

  1. 安装cmake

  2. venv创建您的项目文件夹并使用(使用)初始化虚拟环境Python 3.6 - 3.8。在此示例中,Python 3.8.5 x64-bit选择它是因为它是Miniconda py38_4.9.2.

  3. 安装以下软件包:

py -m pip install numpy cython cmake ninja scikit-build wheel setuptools pyvista pykdtree
  1. 将以下cmake 模块添加到您的系统 cmake 模块文件夹(例如C:\Program Files\CMake\share\cmake-3.21\Modules\)。

  2. 导航到<virtual environment folder>\Lib\site-packages并克隆pyembreerepo:

git clone https://github.com/scopatz/pyembree.git
  1. 将目录更改为pyembree文件夹并创建以下顶级CMakeLists.txt
cmake_minimum_required(VERSION 3.21.0)
project(pyembree
    VERSION 0.1.6
    LANGUAGES CXX
)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED True)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()

set(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake")

find_package(PythonExtensions REQUIRED)
find_package(Cython REQUIRED)
find_package(embree 2 CONFIG REQUIRED)

add_subdirectory(${PROJECT_NAME})
  1. 移动到子文件夹pyembree并创建以下子级别CMakeLists.txt
add_cython_target(mesh_construction.pyx CXX)
add_cython_target(rtcore_scene.pyx CXX)
add_cython_target(rtcore.pyx CXX)
add_cython_target(triangles.pyx CXX)

add_library(${PROJECT_NAME} STATIC ${mesh_construction} ${rtcore_scene} ${rtcore} ${triangles})

target_sources(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

target_include_directories(${PROJECT_NAME}
    PUBLIC "<system python path>/include"
    PUBLIC "C:/vcpkg/installed/x64-windows/include/embree2"
    PUBLIC "<virtual environment folder>/Lib/site-packages/numpy/core/include"
)

target_link_directories(${PROJECT_NAME}
    PUBLIC "<system python path>/libs"
    PUBLIC "C:/vcpkg/installed/x64-windows/lib"
    PUBLIC "C:/vcpkg/installed/x64-windows/bin"
    PUBLIC "<virtual environment folder>/Lib/site-packages/numpy/core/lib"
)

target_link_libraries(${PROJECT_NAME}
    embree
)

python_extension_module(${PROJECT_NAME})

install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib)

替换<system python path>(例如C:/Program Files/Python38)并<virtual environment folder>相应地。

  1. 移回顶级pyembree文件夹并创建以下setup.py文件:
from setuptools import find_packages
from skbuild import setup

import numpy as np
from Cython.Build import cythonize

include_path = [np.get_include()]

ext_modules = cythonize('pyembree/*.pyx', language_level=3, include_path=include_path)
for ext in ext_modules:
    ext.include_dirs = include_path
    ext.libraries = [
        "C:/vcpkg/installed/x86-windows/lib/embree",
        "C:/vcpkg/installed/x86-windows/lib/tbb",
        "C:/vcpkg/installed/x86-windows/lib/tbbmalloc",
        "C:/vcpkg/installed/x86-windows/lib/tbbmalloc_proxy",
]

setup(
    name="pyembree",
    version='0.1.6',
    ext_modules=ext_modules,
    zip_safe=False,
    packages=find_packages(),
    include_package_data=True
)
  1. 将以下行添加到每个*.pyx*.pxd文件的顶部pyembree
# distutils: language=c++
  1. pyembree通过从顶级文件夹运行以下命令来构建和安装pyembree
py setup.py build
py setup.py install
  1. 最后,安装rtreetrimesh
py -m pip install rtree trimesh

当前挑战

我被困在py setup.py build.

  1. 目前,我需要将embree标头和库(.lib.dll)复制并粘贴到源文件夹(<virtual environment folder>/Lib/site-packages/pyembree)和生成的构建文件夹(<virtual environment folder>\Lib\site-packages\pyembree\_skbuild\win-amd64-3.8\cmake-build\pyembree

我可以在 CMake 中使用复制文件命令吗?

  1. 运行时py setup.py build,我收到、和LNK201: unresolved external symbol的链接器错误。我相信这是一个 DLL 构造,它仅适用于 C 语言和共享库(不是静态库),所以我有点困惑。__imp_rtcMapBuffer__imp_rtc_NewTriangleMesh__imp_rtcUnmapBuffer__imp_

对此错误的任何帮助也将不胜感激!

Creating library _skbuild\win-amd64-3.8\setuptools\temp.win-amd64-3.8\Release\pyembree\mesh_construction.cp38-win_amd64.lib and object _skbuild\win-amd64-3.8\setuptools\temp.win-amd64-3.8\Release\pyembree\mesh_construction.cp38-win_amd64.exp
mesh_construction.obj : error LNK2001: unresolved external symbol __imp_rtcMapBuffer
mesh_construction.obj : error LNK2001: unresolved external symbol __imp_rtcNewTriangleMesh
mesh_construction.obj : error LNK2001: unresolved external symbol __imp_rtcUnmapBuffer
_skbuild\win-amd64-3.8\setuptools\lib.win-amd64-3.8\pyembree\mesh_construction.cp38-win_amd64.pyd : fatal error LNK1120: 3 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe' failed with exit status 1120
4

1 回答 1

0

实际上不需要 CMake。有关完整说明,请参阅我在不使用 Conda #468 的情况下在 Windows上安装pyembree的解决方案。

于 2021-08-01T17:24:10.000 回答