c++使用quickjs执行JavaScript
环境 windows10 + clion 2024.x + MinGWx32 + quickjspp(2025-12-06)
直接使用官方的quickjs在windows系统坑比较多,所以使用 https://github.com/ftk/quickjspp 它是 QuickJS 的 c++ 包装
开始
下载 quickjspp 的源码直接使用 clion 2024.x打开 quickjspp-master,然后创建一个 main.cpp
#include "quickjspp.hpp"
#include <iostream>
class MyClass
{
public:
MyClass() {}
MyClass(std::vector<int>) {}
double member_variable = 5.5;
std::string member_function(const std::string& s) { return "Hello, " + s; }
};
void println(qjs::rest<std::string> args) {
for (auto const & arg : args) std::cout << arg << " ";
std::cout << "\n";
}
int main()
{
qjs::Runtime runtime;
qjs::Context context(runtime);
try
{
// export classes as a module
auto& module = context.addModule("MyModule");
module.function<&println>("println");
module.class_<MyClass>("MyClass")
.constructor<>()
.constructor<std::vector<int>>("MyClassA")
.fun<&MyClass::member_variable>("member_variable")
.fun<&MyClass::member_function>("member_function");
// import module
context.eval(R"xxx(
import * as my from 'MyModule';
globalThis.my = my;
)xxx", "<import>", JS_EVAL_TYPE_MODULE);
// evaluate js code
context.eval(R"xxx(
let v1 = new my.MyClass();
v1.member_variable = 1;
let v2 = new my.MyClassA([1,2,3]);
function my_callback(str) {
my.println("at callback:", v2.member_function(str));
}
)xxx");
// callback
auto cb = (std::function<void(const std::string&)>) context.eval("my_callback");
cb("world");
}
catch(qjs::exception)
{
auto exc = context.getException();
std::cerr << (std::string) exc << std::endl;
if((bool) exc["stack"])
std::cerr << (std::string) exc["stack"] << std::endl;
return 1;
}
}
修改 CMakeLists.txt 将执行指向 main
# add_executable(qjs qjs.cpp)
# 改为我们的 main.cpp
add_executable(qjs main.cpp)

cmake_minimum_required(VERSION 3.13)
project(quickjspp LANGUAGES CXX)
#set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
if(CMAKE_COMPILER_IS_GNUCC)
add_compile_options(-Wall -Wno-unused-parameter)
endif()
add_subdirectory(quickjs)
add_library(quickjspp INTERFACE)
target_link_libraries(quickjspp INTERFACE quickjs ${CMAKE_REQUIRED_LIBRARIES})
target_compile_features(quickjspp INTERFACE cxx_std_17)
target_include_directories(quickjspp INTERFACE .)
set_target_properties(quickjspp PROPERTIES PUBLIC_HEADER quickjspp.hpp)
add_executable(qjs main.cpp)
target_link_libraries(qjs quickjspp)
# cmake -DBUILD_TESTING=OFF to disable tests
include(CTest)
if(BUILD_TESTING)
add_subdirectory(test)
endif()
install(TARGETS quickjspp qjs)
Reload CMake Project 后直接起动 main即可

已有项目引用
将 CMakeLists.txt 内容复制到现有项目,修改即可。还需要复制:
- quickjs
- quickjspp.hpp
迁移截图如下:

cmake_minimum_required(VERSION 3.13)
project(demo_quickjspp LANGUAGES CXX)
#set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
if(CMAKE_COMPILER_IS_GNUCC)
add_compile_options(-Wall -Wno-unused-parameter)
endif()
add_subdirectory(quickjs)
add_library(demo_quickjspp INTERFACE)
target_link_libraries(demo_quickjspp INTERFACE quickjs ${CMAKE_REQUIRED_LIBRARIES})
target_compile_features(demo_quickjspp INTERFACE cxx_std_17)
target_include_directories(demo_quickjspp INTERFACE .)
set_target_properties(demo_quickjspp PROPERTIES PUBLIC_HEADER demo_quickjspp.hpp)
add_executable(demo_quickjspp_win main.cpp)
target_link_libraries(demo_quickjspp_win demo_quickjspp)
install(TARGETS demo_quickjspp demo_quickjspp_win)