diff --git a/src/lepton/CompiledExpression.cpp b/src/lepton/CompiledExpression.cpp
index 847707243a161bf0b70ea12d6114a8abb3cc35ad..8f12e8acee723dcbb421a50d3dc2a38cb7392485 100644
--- a/src/lepton/CompiledExpression.cpp
+++ b/src/lepton/CompiledExpression.cpp
@@ -64,6 +64,9 @@
 #include "CompiledExpression.h"
 #include "Operation.h"
 #include "ParsedExpression.h"
+#ifdef __PLUMED_HAS_ASMJIT
+    #include "asmjit/asmjit.h"
+#endif
 #include <utility>
 
 namespace PLMD {
@@ -73,6 +76,19 @@ using namespace std;
     using namespace asmjit;
 #endif
 
+AsmJitRuntimePtr::AsmJitRuntimePtr()
+#ifdef __PLUMED_HAS_ASMJIT
+  : ptr(new asmjit::JitRuntime)
+#endif
+{}
+
+AsmJitRuntimePtr::~AsmJitRuntimePtr()
+{
+#ifdef __PLUMED_HAS_ASMJIT
+  delete static_cast<asmjit::JitRuntime*>(ptr);
+#endif
+}
+
 CompiledExpression::CompiledExpression() : jitCode(NULL) {
 }
 
@@ -225,8 +241,11 @@ static double evaluateOperation(Operation* op, double* args) {
     return op->evaluate(args, *dummyVariables);
 }
 
+static void generateSingleArgCall(X86Compiler& c, X86Xmm& dest, X86Xmm& arg, double (*function)(double));
+
 void CompiledExpression::generateJitCode() {
     CodeHolder code;
+    auto & runtime(*static_cast<asmjit::JitRuntime*>(runtimeptr.get()));
     code.init(runtime.getCodeInfo());
     X86Assembler a(&code);
     X86Compiler c(&code);
@@ -431,7 +450,7 @@ void CompiledExpression::generateJitCode() {
     jitCode = (void*) func0;
 }
 
-void CompiledExpression::generateSingleArgCall(X86Compiler& c, X86Xmm& dest, X86Xmm& arg, double (*function)(double)) {
+void generateSingleArgCall(X86Compiler& c, X86Xmm& dest, X86Xmm& arg, double (*function)(double)) {
     X86Gp fn = c.newIntPtr();
     c.mov(fn, imm_ptr((void*) function));
     CCFuncCall* call = c.call(fn, FuncSignature1<double, double>(CallConv::kIdHost));
diff --git a/src/lepton/CompiledExpression.h b/src/lepton/CompiledExpression.h
index 76af31224ded9d7f69c022e6006c5ed1221bf110..66b38078e16929bb9f7ac573bdcf4a7238a0ecf0 100644
--- a/src/lepton/CompiledExpression.h
+++ b/src/lepton/CompiledExpression.h
@@ -71,13 +71,31 @@
 #include <string>
 #include <utility>
 #include <vector>
-#ifdef __PLUMED_HAS_ASMJIT
-    #include "asmjit/asmjit.h"
-#endif
 
 namespace PLMD {
 namespace lepton {
 
+// Utility class.
+// Implement an unique pointer to asmjit::JitRuntime.
+// Needed to decouple asmjit header file from this one.
+class AsmJitRuntimePtr {
+/// if ASMJIT is not defined, just set the pointer to null
+  void* ptr=nullptr;
+public:
+/// constructor
+  AsmJitRuntimePtr();
+/// destructor
+  ~AsmJitRuntimePtr();
+/// deleted copy constructor
+  AsmJitRuntimePtr(const AsmJitRuntimePtr&) = delete;
+/// deleted assignment
+  AsmJitRuntimePtr & operator=(const AsmJitRuntimePtr&) = delete;
+/// get the pointer
+  void* get() {
+    return ptr;
+  }
+};
+
 class Operation;
 class ParsedExpression;
 
@@ -133,12 +151,9 @@ private:
     mutable std::vector<double> argValues;
     std::map<std::string, double> dummyVariables;
     void* jitCode;
-#ifdef __PLUMED_HAS_ASMJIT
     void generateJitCode();
-    void generateSingleArgCall(asmjit::X86Compiler& c, asmjit::X86Xmm& dest, asmjit::X86Xmm& arg, double (*function)(double));
     std::vector<double> constants;
-    asmjit::JitRuntime runtime;
-#endif
+    AsmJitRuntimePtr runtimeptr;
 };
 
 } // namespace lepton