Julia calling C: A minimal example

Re-posted from: http://perfectionatic.org/?p=249

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 where libmean.so resides,
• the path to libmean.so is in LD_LIBRARY_PATH, or
• the path to the library is pushed to Libdl.DL_LOAD_PATH via

push!(Libdl.DL_LOAD_PATH,"path_to_libmean.so")

P.S. Thanks to Christopher Rackauckas for tips on Julia highlighting.