Unfortunately dynamic library loading/unloading gives the same result
#include <stdint.h>
#include <stdio.h>
#include <windows.h>
#define JULIA_LIB \
"Julia-1.9.4\\bin\\libjulia." \
"dll"
HMODULE libjulia;
#define JL_NOTSAFEPOINT
typedef struct _jl_value_t jl_value_t;
typedef struct _jl_sym_t jl_sym_t;
typedef struct _jl_module_t jl_module_t;
typedef jl_value_t jl_function_t;
static void (*jl_init)(void);
static void (*jl_atexit_hook)(int);
static jl_value_t *(*jl_eval_string)(const char *);
static int64_t (*jl_unbox_int64)(jl_value_t *v) JL_NOTSAFEPOINT;
static void *load_function(const char *name, int *success) {
void *p = GetProcAddress(libjulia, name);
if (!p) {
fprintf(stderr, "%s not found in libjulia.\n", name);
*success = 0;
}
return p;
}
void julia_init() {
libjulia = LoadLibrary(JULIA_LIB);
if (libjulia == NULL) {
fprintf(stderr, "libjulia isn't found.\n");
exit(1);
}
int success = 1;
jl_init = load_function("jl_init", &success);
jl_atexit_hook = load_function("jl_atexit_hook", &success);
jl_eval_string = load_function("jl_eval_string", &success);
jl_unbox_int64 = load_function("jl_unbox_int64", &success);
if (!success) {
fprintf(stderr, "libjulia intialization failed.\n");
}
jl_init();
}
void julia_deinit() {
jl_atexit_hook(0);
BOOL res = FreeLibrary(libjulia);
if (res == FALSE) {
fprintf(stderr, "libjulia library unloading failure.\n");
}
}
int64_t getX() {
jl_value_t *x = jl_eval_string("x");
return jl_unbox_int64(x);
}
int main(int argc, char *argv[]) {
julia_init();
jl_eval_string("x::Int64 = 19");
printf("x: %lld\n", getX());
julia_deinit();
julia_init();
jl_eval_string("x=x+1");
printf("x: %lld\n", getX());
julia_deinit();
return 0;
}
x: 19
x: 20