Wednesday, June 14, 2017

Compiling and running SWIG for Lua in Ubuntu 16.04 using C++

This blog entry is quite similar to my previous entry. The difference is that this entry uses C++ source files instead of C.

We first start with the C++ header file:

extern double My_variable;
int fact(int n);
int my_mod(int x, int y);
char *get_time();
view raw example.hpp hosted with ❤ by GitHub
Notice the use of extern for the declaration of the global variable, since we are dealing with C++ here and not C.

We then create the C++ implementation file:

#include <example.hpp>
#include <ctime>
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);
}
char *get_time()
{
time_t ltime;
time(&ltime);
return ctime(&ltime);
}
view raw example.cpp hosted with ❤ by GitHub
Then we create the interface file for SWIG:

%module example
%{
/* Includes the header in the wrapper code */
#include "example.hpp"
%}
/* Parse the header file to generate wrappers */
%include "example.hpp"
view raw example.i hosted with ❤ by GitHub
We then call SWIG to generate the wrapper file:

% swig -lua -c++ example.i

Notice the use of the -c++ argument.

Next, we compile the wrapper file:

% g++ -fPIC -I/usr/include/lua5.2 -c example_wrap.cxx -o example_wrap.o

Notice that the generated wrapper file has the file suffice .cxx

We then compile the C++ implementation file:

% g++ -fPIC -I. -c example.cpp -o example.o

Finally, we create the shared object to be used by our Lua script:

% g++ -shared -I/usr/include/lua5.2 example_wrap.o example.o -o example.so

We write a Lua script for testing:

package.loadlib('./example.so', 'luaopen_example')()
print(example.My_variable)
print(example.fact(5))
print(example.my_mod(5, 3))
print(example.get_time())
view raw test.lua hosted with ❤ by GitHub
When run:

% lua test.lua
3
120
2
Wed Jun 14 16:41:11 2017

Hope this helps the world. :)

No comments:

Post a Comment