diff --git a/cmake/BuildLibYAML.cmake b/cmake/BuildLibYAML.cmake
index 50e66a35863cafc7274f16016e17ba5a7d1cdc52..01eb6116d74420ef98463cf494eb362fbb6a9e33 100644
--- a/cmake/BuildLibYAML.cmake
+++ b/cmake/BuildLibYAML.cmake
@@ -1,7 +1,7 @@
 #
 # A macro to build the bundled liblua-yaml
 macro(libyaml_build)
-    set(yaml_src ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/lyaml.c
+    set(yaml_src ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/lyaml.cc
 	             ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/api.c
 	             ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/dumper.c
 	             ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/emitter.c
@@ -14,6 +14,10 @@ macro(libyaml_build)
 
     set_source_files_properties(${yaml_src} PROPERTIES COMPILE_FLAGS
         "-std=c99")
+    set_source_files_properties(
+        ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/lyaml.cc
+        PROPERTIES COMPILE_FLAGS
+        "-std=gnu++0x -D__STDC_FORMAT_MACROS=1 -D__STDC_LIMIT_MACROS=1")
 
     add_library(yaml STATIC ${yaml_src})
 
diff --git a/third_party/lua-yaml/lyaml.c b/third_party/lua-yaml/lyaml.cc
similarity index 99%
rename from third_party/lua-yaml/lyaml.c
rename to third_party/lua-yaml/lyaml.cc
index 17fc71b61df860180acafddcef840af0f72c2f34..c462b3a64499827a8cd54fbc898a405a128583bc 100644
--- a/third_party/lua-yaml/lyaml.c
+++ b/third_party/lua-yaml/lyaml.cc
@@ -31,6 +31,7 @@
 #include <stdbool.h>
 #include <inttypes.h>
 
+extern "C" {
 #include <lauxlib.h>
 #include <lua.h>
 #include <lualib.h>
@@ -42,6 +43,7 @@
 
 #include "yaml.h"
 #include "b64.h"
+} /* extern "C" */
 #include "lua/utils.h"
 
 /* configurable flags */
@@ -845,7 +847,7 @@ static int l_null(lua_State *L) {
    return 1;
 }
 
-LUALIB_API int luaopen_yaml(lua_State *L) {
+extern "C" int luaopen_yaml(lua_State *L) {
    const luaL_reg yamllib[] = {
       { "decode", l_load },
       { "encode", l_dump },
@@ -858,6 +860,6 @@ LUALIB_API int luaopen_yaml(lua_State *L) {
    return 1;
 }
 
-LUALIB_API int yamlL_encode(lua_State *L) {
+extern "C" int yamlL_encode(lua_State *L) {
 	return l_dump(L);
 }