Earlier I presented a minimal example of Julia
calling C
. It mimics how one would go about writing C
code, wrapping it a library and then calling it from Julia. Today I came across and even more minimal way of doing that while reading an excellent blog on Julia’s syntactic loop fusion. Associated with the blog was notebook that explores the matter further.
Basically, you an write you C
in a string and pass it directly to the compiler. It goes something like
C_code= """ double mean(double a, double b) { return (a+b) / 2; } """ const Clib=tempname() open(`gcc -fPIC -O3 -xc -shared -o $(Clib * "." * Libdl.dlext) -`, "w") do f print(f, C_code) end
The tempname
function generate a unique temporary file path. On my Linux system Clib
will be string like "/tmp/juliaivzRkT"
. That path is used to generate a library name "/tmp/juliaivzRkT.so"
which will then used in the ccall
:
julia> x=ccall((:mean,Clib),Float64,(Float64,Float64),2.0,5.0) 3.5
This approach would be be recommended if are writing anything sophisticated in C
. However, it fun to experiment with for short bits of C
code that you might like to call from Julia. Saves you the hassle of creating a Makefile
, compiling, etc…