Ubuntu - 链接boost.python - 致命错误:无法找到pyconfig

时间:2013-11-06 11:30:06

标签: c++ ubuntu gcc boost boost-python

遇到一些问题,现在我已阅读以下内容:

hello world python extension in c++ using boost?

我已尝试在我的桌面上安装boost,并按照链接方面建议的帖子完成。我有以下代码:

#include <boost/python.hpp>
#include <Python.h>
using namespace boost::python;

现在我尝试连接以下内容:

g++ testing.cpp -I /usr/include/python2.7/pyconfig.h -L /usr/include/python2.7/Python.h
-lpython2.7

我也尝试了以下内容:

g++ testing.cpp -I /home/username/python/include/ -L /usr/include/python2.7/Python.h -lpython2.7

我一直收到以下错误:

/usr/include/boost/python/detail/wrap_python.hpp:50:23: fatal error: pyconfig.h: No such   
file or directory
# include <pyconfig.h>

我不知道我哪里错了。我安装了boost.python,链接只是一个问题吗?

6 个答案:

答案 0 :(得分:68)

我遇到了同样的错误,问题是g ++找不到pyconfig.h(令人震惊,我知道)。对我来说,此文件位于/usr/include/python2.7/pyconfig.h,因此附加-I /usr/include/python2.7/应修复它,或者您可以使用以下命令将目录添加到路径中:

export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/usr/include/python2.7/"

你也可以将它添加到你的.bashrc中,只要你下次启动你的shell就会添加它(你必须重新打开你的终端来实现这些变化)。

您可以使用find /usr/include -name pyconfig.h找到自己的python包含路径,在我的情况下,它会返回:

/usr/include/python2.7/pyconfig.h
/usr/include/i386-linux-gnu/python2.7/pyconfig.h

答案 1 :(得分:7)

如果您有.c个文件(hello.c)并且想要构建libhello.so库,请尝试:

find /usr/include -name pyconfig.h

[OUT]:

/usr/include/python2.7/pyconfig.h
/usr/include/x86_64-linux-gnu/python2.7/pyconfig.h

然后使用输出并执行:

gcc -shared -o libhello.so -fPIC hello.c -I /usr/include/python2.7/

如果您要从cython的.pyx转换为.so,请尝试使用此python模块,它会在给定.pyx文件时自动生成.so文件:

def pythonizing_cython(pyxfile):
    import os
    # Creates ssetup_pyx.py file.
    setup_py = "\n".join(["from distutils.core import setup",
                          "from Cython.Build import cythonize",
                          "setup(ext_modules = cythonize('"+\
                          pyxfile+".pyx'))"])   

    with open('setup_pyx.py', 'w') as fout:
        fout.write(setup_py)

    # Compiles the .c file from .pyx file.
    os.system('python setup_pyx.py build_ext --inplace')

    # Finds the pyconfig.h file.
    pyconfig = os.popen('find /usr/include -name pyconfig.h'\
                        ).readline().rpartition('/')[0]

    # Builds the .so file.
    cmd = " ".join(["gcc -shared -o", pyxfile+".so",
                    "-fPIC", pyxfile+".c",
                    "-I", pyconfig])
    os.system(cmd)

    # Removing temporary .c and setup_pyx.py files.
    os.remove('setup_pyx.py')
    os.remove(pyxfile+'.c')

答案 2 :(得分:7)

我在为centos7构建提升时有过类似的经历。我无法在我的系统上找到pyconfig.h只有pyconfig-64.h。

搜索后我发现你需要安装python-devel来获取pyconfig.h

答案 3 :(得分:1)

对于CentOS,请执行以下操作:yum install python-devel。然后重试。

答案 4 :(得分:1)

就我而言,我必须在目录 / usr / include /

中创建一个软链接。
ln -s python3.5m python3.5

问题在于我使用的是python 3.5,但仅存在python3.5m目录,因此无法找到 pyconfig.h 文件。

答案 5 :(得分:1)

如果您有多个Python安装,则sysconfig模块可以报告给定安装的pyconfig.h的位置。

$ /path/to/python3 -c 'import sysconfig; print(sysconfig.get_config_h_filename())'
/path/to/pyconfig.h