0

私は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()
4

2 に答える 2

0

推測ですが、エラーメッセージから、パスの問題が発生している可能性があります。srcとtokeniserの間のパスマーカーに注意してください。C:\Users\Richard\workspace\PyBindGen\src\/tokeniser.hpp:13

于 2012-10-02T13:32:16.590 に答える
0

これは簡単な回避策ではありませんでしたが、ここにあります。

「usingnamespacestd;」をすべて削除しました。そして、私のコードからのその他の「使用」アイテムは、代わりに標準ライブラリからのすべてに「std::」を使用しました。これにより、size_t名の競合の問題が解消されました。これはかなり整理されているようで、おそらくGCC_XMLではうまく機能しない標準ライブラリのc++標準/MinGW実装です。言い換えると、c ++標準では、GCC_XMLが理解できない名前空間宣言が許可されているため、競合が発生します。

これは、名前空間にあるものには影響しないように見えることに注意してください。したがって、これは正常に機能します。

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

他の問題は、Boostライブラリの依存関係についてpybindgenに十分に宣言していないことから生じました。これが変更された.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()
于 2012-10-02T15:46:47.683 に答える