跑3DDFA代码,需要cython编译一个C++的函数
(应该是由一个.cpp .pyx编译出一个.so文件)
build的过程中发现include的部分报错
mesh_core_cython.cpp:4:10: fatal error: Python.h: 没有那个文件或目录
#include "Python.h"
^~~~~~~~~~
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
在文件系统用
locate Python.h
看一下程序想要的这个头文件目前的路径
发现是在 usr/include/python2.7下
通过修改setup.py里的
setup(
name='mesh_core_cython',
cmdclass={'build_ext': build_ext},
ext_modules=[Extension("mesh_core_cython",
sources=["mesh_core_cython.pyx", "mesh_core.cpp"],
language='c++',
# include_dirs=[numpy.get_include()])],
include_dirs=["/usr/include/python2.7"])]
)
成功编译出了.so 文件和.cpp函数,但是后面程序调用的时候报错
undefined symbol: _Py_ZeroStruct
查了查可能是因为编译的python版本和调用的python版本不一致,我项目要用的是python3.6,但上面我是用系统自带的python2.7的头文件编译的,所以当然不行。
但为什么我没有一个python3.6的文件夹下有同样的头文件呢
原来是因为我没有装python3 dev
用下面的命令安装
sudo apt-get install python3-dev
过程中出现错误,官网资源列表里是对应ubuntu18.04.3的,而我目前的系统是18.04.01,所以用下面的命令更新下系统之后重新装
sudo apt update
sudo apt-get install python3-dev
现在就有3.6的目录了,如下图
改路径
setup(
name='mesh_core_cython',
cmdclass={'build_ext': build_ext},
ext_modules=[Extension("mesh_core_cython",
sources=["mesh_core_cython.pyx", "mesh_core.cpp"],
language='c++',
# include_dirs=[numpy.get_include()])],
include_dirs=["/usr/include/python3.6"])]
)
然后重新编译!调用成功啦!