在 Windows 中编译 SWIG python 包装器时,MinGW g++ 找不到 numpy\arrayobject.h

Posted

技术标签:

【中文标题】在 Windows 中编译 SWIG python 包装器时,MinGW g++ 找不到 numpy\\arrayobject.h【英文标题】:numpy\arrayobject.h not find by MinGW g++ while compiling SWIG python wrapper in Windows在 Windows 中编译 SWIG python 包装器时,MinGW g++ 找不到 numpy\arrayobject.h 【发布时间】:2013-10-23 02:20:40 【问题描述】:

在我的 debian 发行版中,我设法使用 SWIG 在 C++ 中构建了一个 python 模块。模块Amod 可以在更复杂的python 代码中成功导入并且工作正常。这里是Linux上使用的编译:

swig -c++ -python test5.i
g++ -fPIC -c test5.cpp
g++ -fPIC -c test5_wrap.cxx -I/usr/include/python2.7
g++ -shared test5.o test5_wrap.o -o _Amod.so

但现在我想在 Windows 上重新编译它,我不确定我在做什么。

我安装了 numpy 1.7.0。和带有 g++ 的 MinGW,我在“PATH”环境变量中添加了 swig 的路径,如 SWIG 文档中所述。我还添加了 Python 2.7.5 安装和 Python.h 的路径。

我打开 windows 终端并输入:

swig -c++ -Wall -python test5.i
g++ -c -Wall test5.cpp

它编译没有问题。那么

g++ -c test5_wrap.cxx 

fatal error: Python.h: no such file or directory。我不明白,Python.h 的路径不在 PATH 变量中!?所以我输入

g++ -c test5_wrap.cxx -I C:\Python27\include

fatal error: numpy\arrayobject.h: no such file or directory。我也不明白,这个头文件存在于C:\Python27\Lib\site-packages\numpy\core\include\numpy\ 中。然后我尝试了

g++ -c test5_wrap.cxx -I C:\Python27\include C:\Python27\Lib\site-packages\numpy\core\include\numpy\

同样的错误,所以我尝试了:

g++ -c test5_wrap.cxx -I C:\Python27\include C:\Python27\Lib\site-packages\numpy\core\include\numpy\arrayobject.h

给出一大堆以相同的fatal error: numpy\arrayobject.h: no such file or directory开头的错误。

如何解决? MinGW + SWIG + g++ 是我的 python 模块编译的正确方向吗?

非常感谢。

调频

编辑:同时我也尝试用 distutils 用这个 setup.py 编译这个 python 模块:

# -*- coding: utf-8 -*-
"""
Created on Wed Oct 23 17:01:51 2013

@author: Florian
"""
from distutils.core import setup, Extension


Amod = Extension('_Amod',
                           sources=['test5_wrap.cxx', 'test5.cpp'],
                           )

setup (name = 'Amod',
       version = '0.1',
       author      = "FM",
       description = """Come on""",
       ext_modules = [Amod],
       py_modules = ["Amod"],
       )

并编译:

python setup.py build_ext --compiler=mingw32 --swig-opts="-c++ -I :C/Python27/include -I :C/Python27/Lib/site-packages/numpy/core/include/"

还有这个该死的错误:

running build_ext
building '_Amod' extension
C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27\include -IC:\Python27\PC -c test5_wrap.cxx -o build\temp.win32-2.7\Rel
ease\test5_wrap.o
test5_wrap.cxx:3045:31: fatal error: numpy/arrayobject.h: No such file or directory
 #include <numpy/arrayobject.h>

我在谷歌上搜索了我第一次尝试时遇到的错误undefined reference to _imp__Py...,但人们谈论缺少链接库,我看不出我应该链接哪个库以及为什么。这有点超出我的技能了。

【问题讨论】:

【参考方案1】:

尝试将其更改为-I C:\Python27\include -I C:\Python27\Lib\site-packages\numpy\core\include。这些路径是必需的,因此 gcc 知道在哪里搜索包含标头。

在 *nix 环境中,gcc 在查找包含头文件时可能会查找环境变量和其他隐式搜索路径,这可能就是它编译成功的原因。但是,在 windows mingw 上,您必须明确指定这些路径,以便它看起来在正确的位置。

【讨论】:

好的,它编译。我收到警告:: Warning Msg: Using deprecated NumPy API, disable it #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION") @fmollica 不确定那是什么。也许绑定正在使用一些不推荐使用的功能,这些功能将在未来的版本中逐步淘汰?可能想谷歌并检查 numpy 文档或 repo 的提交日志。您应该找到有关警告的信息 好的,它编译,我相信我可以在 -I....错误`未定义对_imp__Py... 的引用,例如缺少某些库 试试g++ -shared test5.o test5_wrap.o -o _Amod.pyd -L C:\Python27\libs -lpython27。您也可以使用完全限定的路径传入它:g++ -shared test5.o test5_wrap.o -o _Amod.pyd C:/Python27/libs/python27.lib 两天的血与泪告一段落。正确的形式确实是g++ -Wall -shared -I C:\Python27\include -I C:\Python27\Lib\site-packages\numpy\core\include\ test5.o test5_wrap.o -o _Amod.pyd -L C:/Python27/libs/ -lpython27。再次感谢你。还需要注意的是,我在这个 SWIG 过程中遇到的错误之一是我的 .i 文件编码错误,它们需要在 utf-8 中仔细编码。再次感谢。【参考方案2】:

我在 cygwin 中编译 c++ 代码时遇到了同样的问题。解决方案是安装python2-devel和python2-numpy,然后使用命令“python -m site”查看python安装目录。使用以下 find 命令定位头文件:find /usr/lib/python2.7 -name "*.h"。头文件位于目录 /usr/lib/python2.7/site-packages/numpy/core/include 下。使用 g++ 命令的以下包含选项包含此路径:-I/usr/lib/python2.7/site-packages/numpy/core/include。

【讨论】:

以上是关于在 Windows 中编译 SWIG python 包装器时,MinGW g++ 找不到 numpy\arrayobject.h的主要内容,如果未能解决你的问题,请参考以下文章

无法为 c++ python 扩展编译 swig 生成的包装器

函数之间的数组指针丢失值(用 swig 编译以在 python3 中使用)

如何在 Windows 中为 GRIDdb python 客户端设置 swig 安装?

为静态库编译 SWIG Python 包装器?

为 Python 或 SWIG 模块创建编译 C-dll,如何继续?

SWIG 在 Windows 中生成 C++ Python3 包装器导致断言 MSVC 2017