Windows11下用matplotlib_cpp遇numpy.core._multiarray_umath模块缺失求助
一、解决No module named 'numpy.core._multiarray_umath'报错
1. 确认Python环境一致性
确保matplotlib_cpp编译时链接的Python解释器,和安装Numpy1.24.2的Python3.11是同一个环境。如果系统存在多个Python版本,需在CMake构建时明确指定目标Python路径,避免混淆。
2. 修复CMake对Numpy的路径检测
matplotlib_cpp依赖CMake正确识别Python和Numpy的头文件、库文件。修改你的CMakeLists.txt,添加以下配置:
# 明确指定Python版本 find_package(Python 3.11 REQUIRED COMPONENTS Development NumPy) # 添加头文件路径 include_directories(${Python_INCLUDE_DIRS} ${NumPy_INCLUDE_DIRS}) # 链接Python库到你的目标程序 target_link_libraries(your_target_executable ${Python_LIBRARIES})
替换your_target_executable为你的C++项目可执行文件名称。
3. 手动添加Numpy路径到Python运行时
如果Python运行时无法找到Numpy的核心库,可在C++代码初始化Python时,手动添加Numpy的site-packages路径:
#include <Python.h> int main() { Py_Initialize(); // 替换为你的Numpy所在site-packages路径 PyRun_SimpleString(R"(import sys; sys.path.append("C:\\Python3.11\\Lib\\site-packages"))"); // 后续matplotlib_cpp调用代码 Py_Finalize(); return 0; }
同时,将C:\Python3.11\Lib\site-packages\numpy\core添加到系统环境变量PATH中,确保Windows能找到.pyd扩展文件。
4. 降级Numpy版本
Numpy1.24.2与Python3.11可能存在兼容性细节问题,尝试降级到更稳定的版本:
pip uninstall numpy -y pip install numpy==1.23.5
降级后重新编译matplotlib_cpp项目。
二、在Anaconda虚拟环境中构建matplotlib_cpp
1. 准备虚拟环境
打开Anaconda Prompt,创建并激活目标环境:
conda create -n mpl_cpp_env python=3.11 numpy matplotlib -y conda activate mpl_cpp_env
2. 配置CMake指向Anaconda环境
在CMake构建时,需明确指定Anaconda环境的Python解释器路径,避免使用系统Python。
方式1:修改CMakeLists.txt
# 指定Anaconda环境的Python.exe路径 set(Python_EXECUTABLE "C:\\Users\\YourUsername\\anaconda3\\envs\\mpl_cpp_env\\python.exe") find_package(Python REQUIRED COMPONENTS Development NumPy) include_directories(${Python_INCLUDE_DIRS} ${NumPy_INCLUDE_DIRS}) target_link_libraries(your_target_executable ${Python_LIBRARIES})
替换YourUsername和your_target_executable为实际内容。
方式2:CMake命令行参数指定
在项目构建目录下运行:
cmake -G "Visual Studio 17 2022" -A x64 ^ -DPython_EXECUTABLE=C:\Users\YourUsername\anaconda3\envs\mpl_cpp_env\python.exe ^ ..
注意:需使用与Python位数匹配的编译平台(x64,因为Anaconda默认是64位环境),且Visual Studio版本需支持Python3.11编译(推荐VS2022)。
3. 编译项目
生成解决方案后,使用Visual Studio打开并编译,或直接用CMake命令行编译:
cmake --build . --config Release
内容的提问来源于stack exchange,提问作者0xBADF00

