How to embed multithreaded Julia in a graphical macOS app

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
4 Likes