Finally, here’s how to do this via dlopen.
#include <stdlib.h>
#include <dlfcn.h>
int main(int org_argc, char* org_argv[]) {
// dynamically load libjulia
const char* libjulia_path = "usr/lib/libjulia.so";
void* jlptr = dlopen(libjulia_path, RTLD_LAZY);
void (*jl_parse_opts)(int*, char***) = dlsym(jlptr, "jl_parse_opts");
void (*jl_init)() = dlsym(jlptr, "jl_init");
void* (*jl_eval_string)(const char*) = dlsym(jlptr, "jl_eval_string");
void (*jl_atexit_hook)(int) = dlsym(jlptr, "jl_atexit_hook");
// parse options
int argc = 2;
char** argv = malloc(sizeof(char*)*argc);
// first argument is the name of the executable
argv[0] = org_argv[0];
argv[1] = "--threads=4";
// parse arguments
jl_parse_opts(&argc, &argv);
// initialize Julia
jl_init();
jl_eval_string("@info \"debug\" Threads.nthreads()");
jl_atexit_hook(0);
return 0;
}
I compile and run as follows.
$ gcc embed_threads_demo_parse_args_dlopen.c -o embed_threads_demo_parse_args_dlopen -ldl
$ ./embed_threads_demo_parse_args_dlopen
┌ Info: debug
│ Threads.nthreads() = 4
└ @ Main none:1