【问题标题】:Minimal example of C++ with SWIG for Python in Mac在 Mac 中使用 SWIG for Python 的 C++ 最小示例
【发布时间】:2018-10-09 16:31:09
【问题描述】:

我正在尝试在 OSX 中使用 SWIG 为一些 C++ 代码编译 Python 包装器的最小示例。

/* File : example.c */
double My_variable = 3.0;

int fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);
}

int my_mod(int x, int y) {
    return (x%y);
}

和接口文件:

/* example.i */
%module example
%{
    /* Put header files here or function declarations like below */
    extern int fact(int n);
    extern int my_mod(int x, int y);
%}

extern int fact(int n);
extern int my_mod(int x, int y);

我运行以下命令:

swig -python -o example_wrap.c example.i 
gcc -c -arch x86_64 -fPIC example.cxx -o example.o -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
ld -bundle -macosx_version_min 10.13 -flat_namespace -undefined suppress -o _example.so *.o

所有这些都正确地创建了 _example.so、example_wrap.c、example.o 和 example.py。 然后我运行 python2.7

import example

我得到了

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "example.py", line 17, in <module>
    _example = swig_import_helper()
  File "example.py", line 16, in swig_import_helper
    return importlib.import_module('_example')
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: dynamic module does not define init function (init_example)

有什么想法吗?

【问题讨论】:

    标签: macos swig


    【解决方案1】:

    我解决了:

    Swig -python example.i
    Gcc -fPIC -c example.c
    gcc -fPIC -c example_wrap.c -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/
    gcc -dynamiclib -o _example.so *.o -L/usr/lib/ -lpython2.7 -flat_namespace
    

    这里重要的是 -flat_namespace。不知道为什么。

    【讨论】:

      【解决方案2】:

      我也有这个问题,但是我想使用我的 Python 3.8(已安装环境)

      项目。

      这个项目的布局是...

      布局

        /setup.py
        /example.i
        /example.h
        /example.c
        /Makefile.mak
      
      

      代码清单

      example.h

      /* File: example.h */
      
      int fact(int n);
      
      

      example.i

      /* File: example.i */
      %module example
      
      %{
      #define SWIG_FILE_WITH_INIT
      #include "example.h"
      %}
      
      int fact(int n);
      
      

      Makefile.mak

      
      obj = example_wrap.c _example.so
      
      .PHONY: all
      all : $(obj)
      
      clean:
          rm -f *.o
          rm -f *.so
          rm -f *wrap*.c*
          rm -Rf build
      
      example_wrap.c : example.i
          swig -python example.i
      
      _example.so: example.i
          python setup.py build_ext --inplace
      
      test:
          python -c "from _example import fact; print(f'Fact 10 is {fact(10)}')"
      
      

      example.c

      /* File: example.c */
      
      #include "example.h"
      
      int fact(int n) {
          if (n < 0){ /* This should probably return an error, but this is simpler */
              return 0;
          }
          if (n == 0) {
              return 1;
          }
          else {
              /* testing for overflow would be a good idea here */
              return n * fact(n-1);
          }
      }
      
      
      

      setup.py

      #!/usr/bin/env python
      
      """
      setup.py file for SWIG example
      """
      
      from distutils.core import setup, Extension
      
      
      example_module = Extension('_example',
                                 sources=['example_wrap.c', 'example.c'],
                                 )
      
      setup (name = 'example',
             version = '0.1',
             author      = "SWIG Docs",
             description = """Simple swig example from docs""",
             ext_modules = [example_module],
             py_modules = ["example"],
             )
      
      

      构建

      • 切换到您的 Python 环境
      • 制作
      • 进行测试

      应该是这样的。

      希望对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-30
        • 2014-04-19
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多