diff --git a/caca/caca0.c b/caca/caca0.c
index 7ae0b4f..083d945 100644
--- a/caca/caca0.c
+++ b/caca/caca0.c
@@ -23,8 +23,7 @@
 #   include <stdlib.h>
 #endif
 
-#include "caca.h"
-#include "caca_internals.h"
+#include "caca0.h"
 
 /* These variables are needed to emulate old non-thread safe behaviour */
 caca_canvas_t *__caca0_cv = NULL;
diff --git a/caca/caca0.h b/caca/caca0.h
index 0417715..7d48274 100644
--- a/caca/caca0.h
+++ b/caca/caca0.h
@@ -22,31 +22,39 @@
 
 #include <caca.h>
 
+#undef __extern
+#if defined(_DOXYGEN_SKIP_ME)
+#elif defined(_WIN32) && defined(__LIBCACA__)
+#   define __extern extern __declspec(dllexport)
+#else
+#   define __extern extern
+#endif
+
 #ifdef __cplusplus
 extern "C"
 {
 #endif
 
 /* Function emulation */
-extern int __caca0_init(void);
-extern void __caca0_end(void);
-extern unsigned int __caca0_get_event(unsigned int, int);
-extern unsigned int __caca0_sqrt(unsigned int);
-extern int __caca0_get_feature(int);
-extern void __caca0_set_feature(int);
-extern char const *__caca0_get_feature_name(int);
-extern caca_canvas_t *__caca0_load_sprite(char const *);
-extern caca_dither_t *__caca0_create_bitmap(unsigned int, unsigned int,
-          unsigned int, unsigned int, unsigned long int, unsigned long int,
-          unsigned long int, unsigned long int);
-extern void __caca0_free_bitmap(caca_dither_t *);
-extern char const *__caca0_get_color_name(unsigned char);
+__extern int __caca0_init(void);
+__extern void __caca0_end(void);
+__extern unsigned int __caca0_get_event(unsigned int, int);
+__extern unsigned int __caca0_sqrt(unsigned int);
+__extern int __caca0_get_feature(int);
+__extern void __caca0_set_feature(int);
+__extern char const *__caca0_get_feature_name(int);
+__extern caca_canvas_t *__caca0_load_sprite(char const *);
+__extern caca_dither_t *__caca0_create_bitmap(unsigned int, unsigned int,
+            unsigned int, unsigned int, unsigned long int, unsigned long int,
+            unsigned long int, unsigned long int);
+__extern void __caca0_free_bitmap(caca_dither_t *);
+__extern char const *__caca0_get_color_name(unsigned char);
 
 /* These variables are needed to emulate old non-thread safe behaviour */
-extern caca_canvas_t *__caca0_cv;
-extern caca_display_t *__caca0_dp;
-extern unsigned char __caca0_fg;
-extern unsigned char __caca0_bg;
+__extern caca_canvas_t *__caca0_cv;
+__extern caca_display_t *__caca0_dp;
+__extern unsigned char __caca0_fg;
+__extern unsigned char __caca0_bg;
 
 /* These enums and macros changed names or values */
 enum caca_color
@@ -92,6 +100,8 @@ enum caca_feature
     CACA_FEATURE_UNKNOWN = 0xffff
 };
 
+#if ! defined __LIBCACA__
+
 /* This enum still exists in libcaca 1.x, thus cannot be redefined */
 #define CACA_EVENT_NONE          0x00000000
 #define CACA_EVENT_KEY_PRESS     0x01000000
@@ -189,6 +199,8 @@ enum caca_feature
     caca_dither_bitmap(__caca0_cv, x, y, z, t, b, p)
 #define caca_free_bitmap __caca0_free_bitmap
 
+#endif /* ! defined __LIBCACA__ */
+
 #ifdef __cplusplus
 }
 #endif