尝试为c ++ interop自动生成库时出错

时间:2012-10-02 12:57:24

标签: c++ python pybindgen

我正在使用pybindgen在python和c ++之间创建链接代码。或者至少我会是如果我可以使用我的代码。运行时的python文件会产生以下错误。我能以任何方式满足pybindgen或解决这些问题都会非常有帮助。

pygccxml.parser.source_reader.gccxml_runtime_error_t: Error occured while running GCC-XML: In file included from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstdio:44,
                 from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/fstream:43,
                 from C:\Users\Richard\workspace\PyBindGen\src\/tokeniser.hpp:13,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:11,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdio.h:191: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
... [some recuring size_t errors removed because size too big]

c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdio.h:413: error: expected constructor, destructor, or type conversion before 'fwrite'
In file included from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/fstream:43,
                 from C:\Users\Richard\workspace\PyBindGen\src\/tokeniser.hpp:13,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:11,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstdio:109: error: '::fread' has not been declared
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstdio:115: error: '::fwrite' has not been declared
In file included from C:\Users\Richard\workspace\PyBindGen\src\/tokeniser.hpp:14,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:11,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:345: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:345: error: expected constructor, destructor, or type conversion before 'wcstombs'
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:348: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:348: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:348: error: 'size_t' has not been declared
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:349: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:349: error: expected constructor, destructor, or type conversion before 'mbstowcs'
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:350: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:350: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:350: error: 'size_t' has not been declared
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:355: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:355: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:355: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:355: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:355: error: initializer expression list treated as compound expression
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:356: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/stdlib.h:356: error: reference to 'size_t' is ambiguous
... [some recuring size_t errors removed because size too big]
In file included from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstring:44,
                 from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/lexical_cast.hpp:32,
                 from C:\Users\Richard\workspace\PyBindGen\src\/dataitem.hpp:9,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:24,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/string.h:36: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/string.h:36: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/string.h:36: error: 'size_t' has not been declared
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/string.h:37: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
... [some recuring size_t errors removed because size too big]
In file included from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/lexical_cast.hpp:32,
                 from C:\Users\Richard\workspace\PyBindGen\src\/dataitem.hpp:9,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:24,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstring:86: error: '::strcspn' has not been declared
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstring:88: error: '::strlen' has not been declared
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstring:92: error: '::strspn' has not been declared
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstring:94: error: '::strxfrm' has not been declared
In file included from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/ctime:44,
                 from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/bits/locale_facets_nonio.h:39,
                 from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/locale:43,
                 from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/lexical_cast.hpp:47,
                 from C:\Users\Richard\workspace\PyBindGen\src\/dataitem.hpp:9,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:24,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/time.h:124: error: reference to 'size_t' is ambiguous
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/stddef.h:212: error: candidates are: typedef unsigned int size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/mingw32/bits/c++config.h:155: error:                 typedef unsigned int std::size_t
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../include/time.h:124: error: expected constructor, destructor, or type conversion before 'strftime'
In file included from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/bits/locale_facets_nonio.h:39,
                 from c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/locale:43,
                 from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/lexical_cast.hpp:47,
                 from C:\Users\Richard\workspace\PyBindGen\src\/dataitem.hpp:9,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:24,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/ctime:74: error: '::strftime' has not been declared
In file included from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/assert.hpp:81,
                 from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/array.hpp:44,
                 from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/lexical_cast.hpp:146,
                 from C:\Users\Richard\workspace\PyBindGen\src\/dataitem.hpp:9,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:24,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstdlib:122: error: '::mbstowcs' has not been declared
c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/cstdlib:134: error: '::wcstombs' has not been declared
In file included from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/range/end.hpp:24,
                 from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/range/functions.hpp:19,
                 from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/range/iterator_range_core.hpp:26,
                 from C:/Users/Richard/Desktop/code/boost_1_51_0/boost/lexical_cast.hpp:155,
                 from C:\Users\Richard\workspace\PyBindGen\src\/dataitem.hpp:9,
                 from C:\Users\Richard\workspace\PyBindGen\src\/includes.hpp:24,
                 from C:\Users\Richard\workspace\PyBindGen\src\file.hpp:9:
C:/Users/Richard/Desktop/code/boost_1_51_0/boost/range/detail/implementation_help.hpp: In function 'const char* boost::range_detail::str_end(const char*, const char*)':
C:/Users/Richard/Desktop/code/boost_1_51_0/boost/range/detail/implementation_help.hpp:37: error: 'strlen' was not declared in this scope

我的.py文件是

#! /usr/bin/env python

import sys
import os

import pybindgen
from pybindgen.typehandlers import base as typehandlers
from pybindgen import (ReturnValue, Parameter, Module, Function, FileCodeSink)
from pybindgen import (CppMethod, CppConstructor, CppClass, Enum)
from pybindgen.gccxmlparser import ModuleParser
from pybindgen.function import CustomFunctionWrapper
from pybindgen.cppmethod import CustomCppMethodWrapper

import generator_common

def my_module_gen():
    out = FileCodeSink(sys.stdout)
    pygen_file = open(sys.argv[2], "wt")
    module_parser = ModuleParser('eyon', '::')
    module_parser.enable_anonymous_containers = True

    module = module_parser.parse([sys.argv[1]], includes=['"file.hpp"'], pygen_sink=FileCodeSink(pygen_file),
                                 include_paths=["C:\\Users\\Richard\\Desktop\\code\\boost_1_51_0"])
    pygen_file.close()

    generator_common.customize_module(module)

    module.generate(out)


def main():
    if sys.argv[1] == '-d':
        del sys.argv[1]
        import pdb
        pdb.set_trace()
        my_module_gen()
    else:
        import os
        if "PYBINDGEN_ENABLE_PROFILING" in os.environ:
            try:
                import cProfile as profile
            except ImportError:
                my_module_gen()
            else:
                print >> sys.stderr, "** running under profiler"
                profile.run('my_module_gen()', 'foomodulegen-auto.pstat')
        else:
            my_module_gen()            

if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:0)

只是一个猜测,但是从您的错误消息中,您可能会遇到路径问题。请注意src和tokeniser之间的路径标记。 C:\Users\Richard\workspace\PyBindGen\src\/tokeniser.hpp:13

答案 1 :(得分:0)

这不是一件容易的事,但现在就是这样。

我删除了所有“using namespace std;”和我的代码中的任何其他“使用”项目,所以使用“std ::”来表示标准库中的任何内容。这摆脱了size_t名称冲突问题。这看起来很多,可能是标准库的c ++标准/ MinGW实现与GCC_XML不兼容。换句话说,c ++标准允许GCC_XML无法理解的名称空间声明,因此会产生冲突。

请注意,这似乎不会影响名称空间中的内容。所以这很好。

namespace Hello
{
    void func()
    {
        printf("Hello World");
    }
}

其他问题来自于我没有声明pybindgen关于boost库依赖性的问题。这是修改后的.py文件。

#! /usr/bin/env python

import sys
import os

import pybindgen
from pybindgen.typehandlers import base as typehandlers
from pybindgen import (ReturnValue, Parameter, Module, param, Function, FileCodeSink)
from pybindgen import (CppMethod, CppConstructor, CppClass, Enum)
from pybindgen.gccxmlparser import ModuleParser
from pybindgen.function import CustomFunctionWrapper
from pybindgen.cppmethod import CustomCppMethodWrapper

import generator_common

def my_module_gen():
    out = FileCodeSink(sys.stdout)
    pygen_file = open(sys.argv[2], "wt")

    #setup the module
    module = Module('eyon', cpp_namespace='::')
    module.add_include('"file.hpp"')
    module.add_include('"boost/lexical_cast.hpp"')

    module_parser = ModuleParser('eyon', '::')
    module_parser.enable_anonymous_containers = True

    module = module_parser.parse([sys.argv[1]], includes=['"file.hpp"'], pygen_sink=FileCodeSink(pygen_file),
                                 include_paths=["C:\\Users\\Richard\\Desktop\\code\\boost_1_51_0"])
    pygen_file.close()

    module.generate(out)


def main():
    if sys.argv[1] == '-d':
        del sys.argv[1]
        import pdb
        pdb.set_trace()
        my_module_gen()
    else:
        import os
        if "PYBINDGEN_ENABLE_PROFILING" in os.environ:
            try:
                import cProfile as profile
            except ImportError:
                my_module_gen()
            else:
                print >> sys.stderr, "** running under profiler"
                profile.run('my_module_gen()', 'foomodulegen-auto.pstat')
        else:
            my_module_gen()            

if __name__ == '__main__':
    main()