diff --git a/Makefile b/Makefile
index eaa10a0..ba8f798 100644
--- a/Makefile
+++ b/Makefile
@@ -28,13 +28,16 @@ OBJ     = lex.o       \
 OBJ_A = test/ast-test.o
 OBJ_I = test/ir-test.o
 OBJ_C = main.o
-OBJ_X = exec.o util.o
+OBJ_X = exec-standalone.o util.o
 
 #default is compiler only
 default: gmqcc
 %.o: %.c
 	$(CC) -c $< -o $@ $(CFLAGS)
 
+exec-standalone.o: exec.c
+	$(CC) -c $< -o $@ $(CFLAGS) -DQCVM_EXECUTOR=1
+
 # test targets
 test_ast: $(OBJ_A) $(OBJ)
 	$(CC) -o $@ $^ $(CFLAGS)
@@ -43,6 +46,7 @@ test_ir:  $(OBJ_I) $(OBJ)
 qcvm:     $(OBJ_X)
 	$(CC) -o $@ $^ $(CFLAGS)
 exec.o: qcvm_execprogram.h
+exec-standalone.o: qcvm_execprogram.h
 test: test_ast test_ir
 
 # compiler target
diff --git a/exec.c b/exec.c
index a56d400..9aef5f2 100644
--- a/exec.c
+++ b/exec.c
@@ -2,8 +2,6 @@
 
 #include "exec.h"
 
-#define QCVM_EXECUTOR
-
 qc_program* prog_load(const char *filename)
 {
     qc_program *prog;