diff --git a/imap/xapian_wrap.cpp b/imap/xapian_wrap.cpp
index 09b1179e5d..50f278609b 100644
--- a/imap/xapian_wrap.cpp
+++ b/imap/xapian_wrap.cpp
@@ -171,7 +171,7 @@ static void set_db_versions(Xapian::WritableDatabase &database, std::set<int> &v
 
 /* ====================================================================== */
 
-int xapian_compact_dbs(const char *dest, const char **sources)
+EXPORTED int xapian_compact_dbs(const char *dest, const char **sources)
 {
     int r = 0;
     Xapian::Database db;
@@ -323,7 +323,7 @@ static Xapian::TermGenerator::stem_strategy get_stem_strategy(int db_version, in
 
 /* For all db paths in sources that are not using the latest database
  * version or not readable, report their paths in toreindex */
-void xapian_check_if_needs_reindex(const strarray_t *sources, strarray_t *toreindex, int always_upgrade)
+EXPORTED void xapian_check_if_needs_reindex(const strarray_t *sources, strarray_t *toreindex, int always_upgrade)
 {
     // Check the version of all dbs in sources
     for (int i = 0; i < sources->count; i++) {
@@ -377,7 +377,7 @@ static int xapian_dbw_init(xapian_dbw_t *dbw)
     return 0;
 }
 
-int xapian_dbw_open(const char **paths, xapian_dbw_t **dbwp, int mode)
+EXPORTED int xapian_dbw_open(const char **paths, xapian_dbw_t **dbwp, int mode)
 {
     xapian_dbw_t *dbw = (xapian_dbw_t *)xzmalloc(sizeof(xapian_dbw_t));
     int r = 0;
@@ -440,7 +440,7 @@ int xapian_dbw_open(const char **paths, xapian_dbw_t **dbwp, int mode)
     return 0;
 }
 
-int xapian_dbw_openmem(struct xapian_dbw **dbwp)
+EXPORTED int xapian_dbw_openmem(struct xapian_dbw **dbwp)
 {
     xapian_dbw_t *dbw = (xapian_dbw_t *)xzmalloc(sizeof(xapian_dbw_t));
     dbw->is_inmemory = true;
@@ -459,7 +459,7 @@ int xapian_dbw_openmem(struct xapian_dbw **dbwp)
     return r;
 }
 
-void xapian_dbw_close(xapian_dbw_t *dbw)
+EXPORTED void xapian_dbw_close(xapian_dbw_t *dbw)
 {
     if (!dbw) return;
     try {
@@ -482,7 +482,7 @@ void xapian_dbw_close(xapian_dbw_t *dbw)
     }
 }
 
-int xapian_dbw_begin_txn(xapian_dbw_t *dbw)
+EXPORTED int xapian_dbw_begin_txn(xapian_dbw_t *dbw)
 {
     int r = 0;
     try {
@@ -496,7 +496,7 @@ int xapian_dbw_begin_txn(xapian_dbw_t *dbw)
     return r;
 }
 
-int xapian_dbw_commit_txn(xapian_dbw_t *dbw)
+EXPORTED int xapian_dbw_commit_txn(xapian_dbw_t *dbw)
 {
     int r = 0;
     try {
@@ -510,7 +510,7 @@ int xapian_dbw_commit_txn(xapian_dbw_t *dbw)
     return r;
 }
 
-int xapian_dbw_cancel_txn(xapian_dbw_t *dbw)
+EXPORTED int xapian_dbw_cancel_txn(xapian_dbw_t *dbw)
 {
     int r = 0;
     try {
@@ -524,7 +524,7 @@ int xapian_dbw_cancel_txn(xapian_dbw_t *dbw)
     return r;
 }
 
-int xapian_dbw_begin_doc(xapian_dbw_t *dbw, const struct message_guid *guid, char doctype)
+EXPORTED int xapian_dbw_begin_doc(xapian_dbw_t *dbw, const struct message_guid *guid, char doctype)
 {
     int r = 0;
 
@@ -550,7 +550,7 @@ int xapian_dbw_begin_doc(xapian_dbw_t *dbw, const struct message_guid *guid, cha
     return r;
 }
 
-int xapian_dbw_doc_part(xapian_dbw_t *dbw, const struct buf *part, int num_part)
+EXPORTED int xapian_dbw_doc_part(xapian_dbw_t *dbw, const struct buf *part, int num_part)
 {
     int r = 0;
 
@@ -588,7 +588,7 @@ int xapian_dbw_doc_part(xapian_dbw_t *dbw, const struct buf *part, int num_part)
     return r;
 }
 
-int xapian_dbw_end_doc(xapian_dbw_t *dbw)
+EXPORTED int xapian_dbw_end_doc(xapian_dbw_t *dbw)
 {
     int r = 0;
     try {
@@ -608,7 +608,7 @@ int xapian_dbw_end_doc(xapian_dbw_t *dbw)
     return r;
 }
 
-int xapian_dbw_is_indexed(xapian_dbw_t *dbw, const struct message_guid *guid, char doctype)
+EXPORTED int xapian_dbw_is_indexed(xapian_dbw_t *dbw, const struct message_guid *guid, char doctype)
 {
     struct buf buf = BUF_INITIALIZER;
     make_cyrusid(&buf, guid, doctype);
@@ -664,7 +664,7 @@ static int xapian_db_init(xapian_db_t *db)
     return r;
 }
 
-int xapian_db_open(const char **paths, xapian_db_t **dbp)
+EXPORTED int xapian_db_open(const char **paths, xapian_db_t **dbp)
 {
     xapian_db_t *db = (xapian_db_t *)xzmalloc(sizeof(xapian_db_t));
     const char *thispath = "(unknown)";
@@ -726,7 +726,7 @@ done:
     return r;
 }
 
-int xapian_db_opendbw(struct xapian_dbw *dbw, xapian_db_t **dbp)
+EXPORTED int xapian_db_opendbw(struct xapian_dbw *dbw, xapian_db_t **dbp)
 {
     xapian_db_t *db = (xapian_db_t *)xzmalloc(sizeof(xapian_db_t));
 
@@ -748,7 +748,7 @@ int xapian_db_opendbw(struct xapian_dbw *dbw, xapian_db_t **dbp)
     return r;
 }
 
-void xapian_db_close(xapian_db_t *db)
+EXPORTED void xapian_db_close(xapian_db_t *db)
 {
     if (!db) return;
     try {
@@ -768,12 +768,12 @@ void xapian_db_close(xapian_db_t *db)
     }
 }
 
-int xapian_db_has_otherthan_v4_index(const xapian_db_t *db)
+EXPORTED int xapian_db_has_otherthan_v4_index(const xapian_db_t *db)
 {
     return db->database != NULL;
 }
 
-int xapian_db_has_legacy_v4_index(const xapian_db_t *db)
+EXPORTED int xapian_db_has_legacy_v4_index(const xapian_db_t *db)
 {
     return db->legacydbv4 != NULL;
 }
@@ -820,7 +820,7 @@ static Xapian::Query *make_stem_match_query(const xapian_db_t *db,
     }
 }
 
-xapian_query_t *
+EXPORTED xapian_query_t *
 xapian_query_new_match(const xapian_db_t *db, int partnum, const char *str)
 {
     if (db->shards->empty()) {
@@ -865,7 +865,7 @@ xapian_query_new_match(const xapian_db_t *db, int partnum, const char *str)
     }
 }
 
-xapian_query_t *xapian_query_new_compound(const xapian_db_t *db __attribute__((unused)),
+EXPORTED xapian_query_t *xapian_query_new_compound(const xapian_db_t *db __attribute__((unused)),
                                           int is_or, xapian_query_t **children, int n)
 {
     try {
@@ -898,7 +898,7 @@ xapian_query_t *xapian_query_new_compound(const xapian_db_t *db __attribute__((u
 
 /* Xapian does not have an OP_NOT.  WTF?  We fake it with
  * OP_AND_NOT where the left child is MatchAll */
-xapian_query_t *xapian_query_new_not(const xapian_db_t *db __attribute__((unused)),
+EXPORTED xapian_query_t *xapian_query_new_not(const xapian_db_t *db __attribute__((unused)),
                                      xapian_query_t *child)
 {
     try {
@@ -918,12 +918,12 @@ xapian_query_t *xapian_query_new_not(const xapian_db_t *db __attribute__((unused
     }
 }
 
-xapian_query_t *xapian_query_new_matchall(const xapian_db_t *db __attribute__((unused)))
+EXPORTED xapian_query_t *xapian_query_new_matchall(const xapian_db_t *db __attribute__((unused)))
 {
     return (xapian_query_t *) new Xapian::Query(Xapian::Query::MatchAll);
 }
 
-xapian_query_t *xapian_query_new_has_doctype(const xapian_db_t *db __attribute__((unused)),
+EXPORTED xapian_query_t *xapian_query_new_has_doctype(const xapian_db_t *db __attribute__((unused)),
                                              char doctype, xapian_query_t *child)
 {
     try {
@@ -943,7 +943,7 @@ xapian_query_t *xapian_query_new_has_doctype(const xapian_db_t *db __attribute__
     }
 }
 
-void xapian_query_free(xapian_query_t *qq)
+EXPORTED void xapian_query_free(xapian_query_t *qq)
 {
     try {
         delete (Xapian::Query *)qq;
@@ -954,7 +954,7 @@ void xapian_query_free(xapian_query_t *qq)
     }
 }
 
-int xapian_query_run(const xapian_db_t *db, const xapian_query_t *qq, int is_legacy,
+EXPORTED int xapian_query_run(const xapian_db_t *db, const xapian_query_t *qq, int is_legacy,
                      int (*cb)(void *data, size_t n, void *rock), void *rock)
 {
     const Xapian::Query *query = (const Xapian::Query *)qq;
@@ -1028,7 +1028,7 @@ struct xapian_snipgen
     size_t max_len;
 };
 
-xapian_snipgen_t *xapian_snipgen_new(xapian_db_t *db,
+EXPORTED xapian_snipgen_t *xapian_snipgen_new(xapian_db_t *db,
                                      const char *hi_start,
                                      const char *hi_end,
                                      const char *omit)
@@ -1046,7 +1046,7 @@ xapian_snipgen_t *xapian_snipgen_new(xapian_db_t *db,
     return snipgen;
 }
 
-void xapian_snipgen_free(xapian_snipgen_t *snipgen)
+EXPORTED void xapian_snipgen_free(xapian_snipgen_t *snipgen)
 {
     delete snipgen->default_stemmer;
     delete snipgen->loose_terms;
@@ -1101,7 +1101,7 @@ static Xapian::Query xapian_snipgen_build_query(xapian_snipgen_t *snipgen, Xapia
     return q;
 }
 
-int xapian_snipgen_add_match(xapian_snipgen_t *snipgen, const char *match)
+EXPORTED int xapian_snipgen_add_match(xapian_snipgen_t *snipgen, const char *match)
 {
     size_t len = strlen(match);
     bool is_query = len > 1 && ((match[0] == '"' && match[len-1] == '"') ||
@@ -1122,7 +1122,7 @@ int xapian_snipgen_add_match(xapian_snipgen_t *snipgen, const char *match)
     return 0;
 }
 
-int xapian_snipgen_begin_doc(xapian_snipgen_t *snipgen,
+EXPORTED int xapian_snipgen_begin_doc(xapian_snipgen_t *snipgen,
                              const struct message_guid *guid, char doctype)
 {
     struct buf buf = BUF_INITIALIZER;
@@ -1134,7 +1134,7 @@ int xapian_snipgen_begin_doc(xapian_snipgen_t *snipgen,
     return 0;
 }
 
-int xapian_snipgen_make_snippet(xapian_snipgen_t *snipgen,
+EXPORTED int xapian_snipgen_make_snippet(xapian_snipgen_t *snipgen,
                                 const struct buf *part,
                                 Xapian::Stem* stemmer)
 {
@@ -1170,7 +1170,7 @@ int xapian_snipgen_make_snippet(xapian_snipgen_t *snipgen,
     return r;
 }
 
-int xapian_snipgen_doc_part(xapian_snipgen_t *snipgen, const struct buf *part,
+EXPORTED int xapian_snipgen_doc_part(xapian_snipgen_t *snipgen, const struct buf *part,
 		                    int partnum __attribute__((unused)))
 {
     // Ignore empty queries.
@@ -1182,7 +1182,7 @@ int xapian_snipgen_doc_part(xapian_snipgen_t *snipgen, const struct buf *part,
     return xapian_snipgen_make_snippet(snipgen, part, snipgen->default_stemmer);
 }
 
-int xapian_snipgen_end_doc(xapian_snipgen_t *snipgen, struct buf *buf)
+EXPORTED int xapian_snipgen_end_doc(xapian_snipgen_t *snipgen, struct buf *buf)
 {
     buf_reset(buf);
     buf_copy(buf, snipgen->buf);
@@ -1202,7 +1202,7 @@ int xapian_snipgen_end_doc(xapian_snipgen_t *snipgen, struct buf *buf)
 }
 
 /* cb returns true if document should be copied, false if not */
-int xapian_filter(const char *dest, const char **sources,
+EXPORTED int xapian_filter(const char *dest, const char **sources,
                   int (*cb)(const char *cyrusid, void *rock),
                   void *rock)
 {
@@ -1268,7 +1268,7 @@ struct xapian_doc {
     Xapian::Document *doc;
 };
 
-xapian_doc_t *xapian_doc_new(void)
+EXPORTED xapian_doc_t *xapian_doc_new(void)
 {
     xapian_doc_t *doc = (xapian_doc_t *) xzmalloc(sizeof(struct xapian_doc));
     doc->doc = new Xapian::Document;
@@ -1277,17 +1277,17 @@ xapian_doc_t *xapian_doc_new(void)
     return doc;
 }
 
-void xapian_doc_index_text(xapian_doc_t *doc, const char *text, size_t len)
+EXPORTED void xapian_doc_index_text(xapian_doc_t *doc, const char *text, size_t len)
 {
     doc->termgen->index_text(Xapian::Utf8Iterator(text, len));
 }
 
-size_t xapian_doc_termcount(xapian_doc_t *doc)
+EXPORTED size_t xapian_doc_termcount(xapian_doc_t *doc)
 {
     return doc->doc->termlist_count();
 }
 
-int xapian_doc_foreach_term(xapian_doc_t *doc, int(*cb)(const char*, void*), void *rock)
+EXPORTED int xapian_doc_foreach_term(xapian_doc_t *doc, int(*cb)(const char*, void*), void *rock)
 {
     for (Xapian::TermIterator ti = doc->doc->termlist_begin();
             ti != doc->doc->termlist_end(); ++ti) {
@@ -1297,13 +1297,13 @@ int xapian_doc_foreach_term(xapian_doc_t *doc, int(*cb)(const char*, void*), voi
     return 0;
 }
 
-void xapian_doc_reset(xapian_doc_t *doc)
+EXPORTED void xapian_doc_reset(xapian_doc_t *doc)
 {
     doc->doc->clear_values();
 }
 extern void xapian_doc_close(xapian_doc_t *termgen);
 
-void xapian_doc_close(xapian_doc_t *doc)
+EXPORTED void xapian_doc_close(xapian_doc_t *doc)
 {
     delete doc->termgen;
     delete doc->doc;
