【问题标题】:CMake Build Help for `pyembree``pyembree` 的 CMake 构建帮助
【发布时间】:2021-07-29 14:55:14
【问题描述】:

我正在寻求使用 CMake for Windows 从源代码构建 pyembree 的帮助。列出了此问题历史的更多详细信息here on GitHub。 Windows 对 conda-forge 上的 pyembree 的支持刚刚被删除,因此我们将不胜感激任何可以提供的帮助!

安装说明

系统

测试日期:

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

步骤

  1. 安装Microsoft Visual C++ 14.X and 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)

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

  1. C:\\vcpkg 中安装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 中使用的 Python 版本。

  3. 安装以下软件包:

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

  2. 导航到<virtual environment folder>\Lib\site-packages 并克隆pyembree 存储库:

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)

相应地替换&lt;system python path&gt;(例如C:/Program Files/Python38)和&lt;virtual environment folder&gt;

  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. 将以下行添加到pyembree 中每个*.pyx*.pxd 文件的顶部:
# 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)复制并粘贴到源文件夹(&lt;virtual environment folder&gt;/Lib/site-packages/pyembree)和生成的构建文件夹(&lt;virtual environment folder&gt;\Lib\site-packages\pyembree\_skbuild\win-amd64-3.8\cmake-build\pyembree)中

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

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

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

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

【问题讨论】:

  • "请在此处找到完整的详细信息。" - 不,这在 Stack Overflow 上不起作用。在这里,我们希望问题帖包含理解问题所需的信息。指向该信息的链接不符合要求。
  • @Tsyvarev 这绝对是愚蠢的,但我会遵守的。给我一点时间重复一下 GitHub 上已有的内容。

标签: windows cmake scikits embree


【解决方案1】:

实际上不需要 CMake。有关完整说明,请参阅我在 Install pyembree on Windows without Conda #468 上的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多