This blog is a “Hello World” example of Julia calling C.
We start of by at bit of C code we want to call from Julia. We write the following in calc_mean.c
double mean(double a, double b) { return (a+b) / 2; }
To build the library, we need to create a Makefile
CC=gcc CFLAGS=-c -Wall -fPIC SOURCES=calc_mean.c OBJECTS=$(SOURCES:.c=.o) .c.o: $(CC) $(CFLAGS) $< -o $@ lib: $(OBJECTS) $(CC) -shared -fPIC -o libmean.so $(OBJECTS) clean: rm *.o *.so
The option fPIC
and -shared
are essential for Julia to be able to resolve the function in our library. Now we are almost ready to build our library. From the bash
terminal we invoke:
make lib
This will generate a libmean.so
file.
In Julia we call the function in our c library by
x=ccall((:mean,"libmean"),Float64,(Float64,Float64),2.0,5.0) println(x) 3.5
For this to work,
Julia
must be running either on the same path wherelibmean.so
resides,- the path to
libmean.so
is inLD_LIBRARY_PATH
, or - the path to the library is
push
ed toLibdl.DL_LOAD_PATH
via
…
push!(Libdl.DL_LOAD_PATH,"path_to_libmean.so")
P.S. Thanks to Christopher Rackauckas for tips on Julia
highlighting.