Call Codon from C/C++
Codon can be called from C/C++ code by compiling to a shared library that can be linked to a C/C++ application.
Codon functions can be made externally visible by annotating
them with @export
decorator:
@export
def foo(n: int):
for i in range(n):
print(i * i)
return n * n
Note that only top-level, non-generic functions can be exported. Now we
can create a shared library containing foo
(assuming source file
foo.codon
):
codon build --relocation-model=pic --lib -o libfoo.so foo.codon
Now we can call foo
from a C program (if you're using C++, mark the
Codon function as extern "C"
):
#include <stdint.h>
#include <stdio.h>
int64_t foo(int64_t);
// In C++, it would be:
// extern "C" int64_t foo(int64_t);
int main() {
printf("%llu\n", foo(10));
}
Compile:
gcc -o foo -L. -lfoo foo.c # or g++ if using C++
Now running ./foo
will invoke foo()
as defined in Codon, with an
argument of 10
.
Note that if the generated shared library is in a non-standard path, you can either:
- Add the
rpath
to thegcc
command:-Wl,-rpath=/path/to/lib/dir
- Add the library path to
LD_LIBRARY_PATH
(orDYLD_LIBRARY_PATH
if using macOS):export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib/dir
.
Type conversions between Codon and C/C++ are detailed here.