Skip to content

06. How Create a C Module

Gurigraphics edited this page Mar 22, 2022 · 2 revisions

Create file: my_module.js

import * as myModule from 'my_module'

const value = myModule.plus(1, 2)
console.log("Result:", value)

// Output => Result: 3

Create file: my_module.c

#include "quickjs.h"
#include "cutils.h"

static JSValue plusNumbers(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
{
    int a, b;

    if (JS_ToInt32(ctx, &a, argv[0]))
        return JS_EXCEPTION;
    
    if (JS_ToInt32(ctx, &b, argv[1]))
        return JS_EXCEPTION;
        
    return JS_NewInt32(ctx, a + b);
}

static const JSCFunctionListEntry js_my_module_funcs[] = {
    JS_CFUNC_DEF("plus", 2, plusNumbers),
};

static int js_my_module_init(JSContext *ctx, JSModuleDef *m)
{
    return JS_SetModuleExportList(ctx, m, js_my_module_funcs, countof(js_my_module_funcs));
}

JSModuleDef *js_init_module_my_module(JSContext *ctx, const char *module_name)
{
    JSModuleDef *m;
    m = JS_NewCModule(ctx, module_name, js_my_module_init);
    
    if (!m)
        return NULL;
    
    JS_AddModuleExportList(ctx, m, js_my_module_funcs, countof(js_my_module_funcs));
    return m;
}

Generate file: my_module.o

gcc -c my_module.c

Add to "lib objects list" in Makefile

QJS_LIB_OBJS= ... $(OBJDIR)/my_module.o

Add my_module to file qjsc.c. After "std" and "os" modules

/* add system modules */
namelist_add(&cmodule_list, "std", "std", 0);
namelist_add(&cmodule_list, "os", "os", 0);
// our module
namelist_add(&cmodule_list, "my_module", "my_module", 0);

Generate a new compiler qjsc.exe

make qjsc LDEXPORT="-static -s"

Generate file: my_module_js.c

qjsc -e -m -o my_module_js.c my_module.js 

Generate file: my_module.exe

gcc -D_GNU_SOURCE -I./ -o my_module my_module_js.c -static -s -L./ -lquickjs -lm -ldl -lpthread

Errors

if error: no found quickjs or no found js_init_module_my_module, Make clean and repeat

Make clean

References

Clone this wiki locally