对于简单的示例,SIP Python / C ++绑定无法编译

时间:2012-05-25 12:03:48

标签: c++ python python-sip

使用SIP成功编译Python / C绑定后,我想用Python / C ++做同样的事情。出于某种原因,这不起作用。

这是文件:

fib.cpp

#include "fib.h"

int fib1(int n)
{
    if (n <= 0) {
        return 0;
    } else if (n <= 2) {
        return 1;
    } else {
        return fib1(n-1) + fib1(n-2);
    }
}

fib.h

int fib1(int n);

fib.sip

%Module fib

%Include fib.h

我运行以下命令来构建中间文件: sip -c . fib.sip

到目前为止一切正常。

现在我想使用distutils构建.pyd文件。

setup.py

from distutils.core import setup, Extension
import sipdistutils

setup(
  name = 'fib',
  versione = '1.0',
  ext_modules=[
    Extension("fib", ["fib.sip", "fib.cpp"]),
    ],

   cmdclass = {'build_ext': sipdistutils.build_ext}
 )

我运行以下命令: python setup.py build

此操作失败,并显示以下错误:

build\temp.win32-2.7\Release\sipfibcmodule.cpp:29:29: error: 'fib1' was not declared in this scope
error: command 'gcc' failed with exit status 1

问题是什么?顺便说一下,c ++不应该用作编译器而不是gcc吗?

任何帮助表示赞赏!

亲切的问候

大卫

1 个答案:

答案 0 :(得分:0)

我找到了一个足够好的解决方案:命名空间。下次我会更好地阅读文档。我还应该提一下,使用Fibonacci类的解决方案可以解决问题,但我没有发现这是令人满意的。

可以找到文件内容。

fib.cpp

#include "fib.h"

namespace test
{
    int fib1(int n)
    {
        if (n <= 0) {
            return 0;
        } else if (n <= 2) {
            return 1;
        } else {
            return fib1(n-1) + fib1(n-2);
        }
    }
}

fib.h

namespace test
{
    int fib1(int n);
}

fib.sip

%Module fib

namespace test {
    %TypeHeaderCode
    #include "fib.h"
    %End

    int fib1(int n);
};

setup.py - 没有改变

使用了与之前提到的完全相同的命令。