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:
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
push
ed 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.