it might be caused by a genuine error (usually an extern declared differently in two .c files rather than in a common .h), or often by a construction similar to the following: file1.h: typedef struct Secret Secret; void fred(Secret*); file1.c #include "file1.h" /* use fred */ file2.c #include "file1.h" struct Secret { ... }; void fred(Secret *s) { ... } so that in scope file1.c the signature of Secret (and thus fred) is different from that in file2.c. follow the declaration of Secret in file1.h by #pragma incomplete Secret to ensure that although file2.c declares Secret in full, the full declaration is ignored when calculating the signature of Secret and fred, producing the same result for signof in file2 as in file1.c (there are examples in the kernel sources, see portdat.h) i added a way for the #pragma to switch off the checking for basket cases such as freetype, but that change seems to have gone missing, even from my own copies. i'll find it. you can comment out the -T option in CFLAGS in /sys/src/mkfile.proto if you're in a hurry