diff --git a/pyopencl/_cffi.py b/pyopencl/_cffi.py
index 977376fab8b0e0399768f4c75edec19197b10f49..d72c05388f4645998b05b3d3cb35683c162cb669 100644
--- a/pyopencl/_cffi.py
+++ b/pyopencl/_cffi.py
@@ -90,15 +90,16 @@ typedef struct _cl_buffer_region {
 """
 
 
-def _get_wrap_header():
+def _get_wrap_header(filename):
     from pkg_resources import Requirement, resource_filename
     header_name = resource_filename(
-            Requirement.parse("pyopencl"), "pyopencl/c_wrapper/wrap_cl_core.h")
+            Requirement.parse("pyopencl"), "pyopencl/c_wrapper/"+filename)
 
     with open(header_name, "rt") as f:
         return f.read()
 
-_ffi.cdef(_cl_header + "\n" + _get_wrap_header())
+_ffi.cdef(_cl_header)
+_ffi.cdef(_get_wrap_header("wrap_cl_core.h"))
 
 
 def _get_wrapcl_so_name():
@@ -109,3 +110,6 @@ def _get_wrapcl_so_name():
     return os.path.join(current_directory, "_wrapcl.so")
 
 _lib = _ffi.dlopen(_get_wrapcl_so_name())
+
+if _lib.pyopencl_have_gl():
+    _ffi.cdef(_get_wrap_header("wrap_cl_gl_core.h"))
diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 0ad5c337a08fea5cc4f526ebba6194b85baadb37..a3b6f54e5a4c434d907fec472f5c2b1b2fe62529 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -1,3 +1,6 @@
+// Everything in here should have a 'pyopencl_' prefix to avoid clashing with
+// other libraries imported via CFFI.
+
 typedef enum { KND_UNKNOWN, KND_SOURCE, KND_BINARY } program_kind_type;
 
 typedef struct {
@@ -32,7 +35,8 @@ typedef struct {
 } generic_info;
 
 
-int get_cl_version(void);
+int pyopencl_get_cl_version(void);
+
 error *get_platforms(void **ptr_platforms, uint32_t *num_platforms);
 error *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *num_devices, cl_device_type devtype);
 error *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices);
@@ -76,16 +80,8 @@ intptr_t _int_ptr(void*, class_t);
 void* _from_int_ptr(void **ptr_out, intptr_t int_ptr_value, class_t);
 error *_get_info(void *ptr, class_t class_, cl_uint param, generic_info *out);
 void _delete(void *ptr, class_t class_);
-void free_pointer(void*);
-void free_pointer_array(void**, uint32_t size);
-
-unsigned bitlog2(unsigned long v);
-
 
-/* gl interop */
+void pyopencl_free_pointer(void*);
+void pyopencl_free_pointer_array(void**, uint32_t size);
 
-int have_gl();
-error *_create_from_gl_buffer(void **ptr, void *ptr_context, cl_mem_flags flags, GLuint bufobj);
-error *_create_from_gl_renderbuffer(void **ptr, void *ptr_context, cl_mem_flags flags, GLuint bufobj);
-error *_enqueue_acquire_gl_objects(void **ptr_event, void *ptr_command_queue, void **ptr_mem_objects, uint32_t num_mem_objects, void **wait_for, uint32_t num_wait_for);
-error *_enqueue_release_gl_objects(void **ptr_event, void *ptr_command_queue, void **ptr_mem_objects, uint32_t num_mem_objects, void **wait_for, uint32_t num_wait_for);
+int pyopencl_have_gl();
diff --git a/pyopencl/c_wrapper/wrap_cl_gl_core.h b/pyopencl/c_wrapper/wrap_cl_gl_core.h
new file mode 100644
index 0000000000000000000000000000000000000000..c362cca1233c2775a088b2022ca2cc869c60e8e4
--- /dev/null
+++ b/pyopencl/c_wrapper/wrap_cl_gl_core.h
@@ -0,0 +1,7 @@
+// Everything in here should have a 'pyopencl_' prefix to avoid clashing with
+// other libraries imported via CFFI.
+
+error *_create_from_gl_buffer(void **ptr, void *ptr_context, cl_mem_flags flags, GLuint bufobj);
+error *_create_from_gl_renderbuffer(void **ptr, void *ptr_context, cl_mem_flags flags, GLuint bufobj);
+error *_enqueue_acquire_gl_objects(void **ptr_event, void *ptr_command_queue, void **ptr_mem_objects, uint32_t num_mem_objects, void **wait_for, uint32_t num_wait_for);
+error *_enqueue_release_gl_objects(void **ptr_event, void *ptr_command_queue, void **ptr_mem_objects, uint32_t num_mem_objects, void **wait_for, uint32_t num_wait_for);
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 094f3e7881f8b0b3262742794e9c432e182b1d35..1502af600f58d84d84cc5cdba9d5255bd4e8f755 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -50,7 +50,7 @@ class _CArray(object):
 
     def __del__(self):
         if self.ptr != _ffi.NULL:
-            _lib.free_pointer(self.ptr[0])
+            _lib.pyopencl_free_pointer(self.ptr[0])
 
     def __getitem__(self, key):
         return self.ptr[0].__getitem__(key)
@@ -62,7 +62,8 @@ class _CArray(object):
 
 class _CArrays(_CArray):
     def __del__(self):
-        _lib.free_pointer_array(_ffi.cast('void**', self.ptr[0]), self.size[0])
+        _lib.pyopencl_free_pointer_array(
+                _ffi.cast('void**', self.ptr[0]), self.size[0])
         super(_CArrays, self).__del__()
 
 # }}}
@@ -95,7 +96,7 @@ def _generic_info_to_python(info):
 
         if type_.endswith(']'):
             ret = map(ci, value)
-            _lib.free_pointer(info.value)
+            _lib.pyopencl_free_pointer(info.value)
             return ret
         else:
             return ci(value)
@@ -103,7 +104,7 @@ def _generic_info_to_python(info):
         ret = _ffi.string(value)
     elif type_.startswith('char*['):
         ret = map(_ffi.string, value)
-        _lib.free_pointer_array(info.value, len(value))
+        _lib.pyopencl_free_pointer_array(info.value, len(value))
     elif type_.endswith(']'):
         if type_.startswith('char['):
             ret = ''.join(a[0] for a in value)
@@ -120,7 +121,7 @@ def _generic_info_to_python(info):
     else:
         ret = value[0]
     if info.dontfree == 0:
-        _lib.free_pointer(info.value)
+        _lib.pyopencl_free_pointer(info.value)
     return ret
 
 # }}}
@@ -179,7 +180,7 @@ class _Common(object):
 
 
 def get_cl_header_version():
-    v = _lib.get_cl_version()
+    v = _lib.pyopencl_get_cl_version()
     return (v >> (3*4),
             (v >> (1*4)) & 0xff)
 
@@ -269,8 +270,8 @@ def _handle_error(error):
         # non-pyopencl exceptions are handled here
         import exceptions
         e = exceptions.RuntimeError(_ffi.string(error.msg))
-        _lib.free_pointer(error.msg)
-        _lib.free_pointer(error)
+        _lib.pyopencl_free_pointer(error.msg)
+        _lib.pyopencl_free_pointer(error)
         raise e
     if error.code == status_code.MEM_OBJECT_ALLOCATION_FAILURE:
         klass = MemoryError
@@ -282,9 +283,9 @@ def _handle_error(error):
         klass = Error
     e = klass(routine=_ffi.string(error.routine),
             code=error.code, msg=_ffi.string(error.msg))
-    _lib.free_pointer(error.routine)
-    _lib.free_pointer(error.msg)
-    _lib.free_pointer(error)
+    _lib.pyopencl_free_pointer(error.routine)
+    _lib.pyopencl_free_pointer(error.msg)
+    _lib.pyopencl_free_pointer(error)
     raise e
 
 # }}}
@@ -790,7 +791,7 @@ def _enqueue_read_image(queue, mem, origin, region,
 # {{{ gl interop
 
 def have_gl():
-    return bool(_lib.have_gl())
+    return bool(_lib.pyopencl_have_gl())
 
 
 class GLBuffer(MemoryObject):
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index 4d976d86a89de003422c16235bd4329fd5d7a09f..ba2ba1207dad8314feda53637c7ebe4f46a3a3cd 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -2823,15 +2823,15 @@ namespace pyopencl
 
 // {{{ c wrapper
 
-void free_pointer(void *p)
+void pyopencl_free_pointer(void *p)
 {
   free(p);
 }
 
-void free_pointer_array(void **p, uint32_t size)
+void pyopencl_free_pointer_array(void **p, uint32_t size)
 {
   for(uint32_t i = 0; i < size; ++i)
-    free_pointer(p[i]);
+    pyopencl_free_pointer(p[i]);
 }
 
 
@@ -3336,13 +3336,13 @@ void _delete(void *ptr, class_t class_) {
 }
 
 
-int get_cl_version(void) {
+int pyopencl_get_cl_version(void) {
   return PYOPENCL_CL_VERSION;
 }
 
 // {{{ gl interop
 
-int have_gl() {
+int pyopencl_have_gl() {
 #ifdef HAVE_GL
   return 1;
 #else
diff --git a/src/c_wrapper/wrap_cl.h b/src/c_wrapper/wrap_cl.h
index ce039d14b3e8ef3fe30e063d7fdb472bd0a3d968..f15e3deb3e829ddeb63a0ca0eb0d97f2ab2e4ea8 100644
--- a/src/c_wrapper/wrap_cl.h
+++ b/src/c_wrapper/wrap_cl.h
@@ -64,7 +64,11 @@ extern "C" {
 #endif
 
 #include "wrap_cl_core.h"
-  
+
+#ifdef HAVE_GL
+#include "wrap_cl_gl_core.h"
+#endif
+
 #ifdef __cplusplus
 }
 #endif