Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Minimal example of C++ with SWIG for Python in Mac

Tags:

macos

swig

I am trying to compile a minimal example of a python wrapper for some C++ code with SWIG in OSX.

/* 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);
}

and the interface file:

/* 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);

I run the following:

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

All of these correctly creates _example.so, example_wrap.c, example.o and example.py. Then I run python2.7

import example

and I get

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)

Any idea?

like image 279
Vaaal88 Avatar asked Nov 15 '25 09:11

Vaaal88


2 Answers

I solved it:

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

What's important here is the -flat_namespace. Not sure why though.

like image 103
Vaaal88 Avatar answered Nov 18 '25 21:11

Vaaal88


I also had this issue however I wanted to use my Python 3.8 (env installed)

Project .

Layout of this project is ...

Layout

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

Code Listing

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"],
       )

To build

  • switch to your Python Env
  • make
  • make test

That should be it.

Hope that helps someone.

like image 32
Tim Seed Avatar answered Nov 18 '25 21:11

Tim Seed



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!