Undefined reference to posix_memalign using mingw32

c, cross-compiling, memory-alignment, memory-management, mingw32

Solution

You should be able to use `_aligned_malloc`. Other functions can be missing in mingw.

- Update your mingw. It should work in 4.6.2.

- Try `__mingw_aligned_malloc` instead.

Include your headers in this order:

#include <stdlib.h>
#include <intrin.h>
#include <malloc.h>
#include <windows.h>

`_aligned_malloc`/`_aligned_free` is just a simple wrapper around `malloc`/`free`. If everything else fails, you should be able to write it yourself.

Problem

I'm using Debian Squeeze, cross compiling for windows targets using mingw32. For a Linux target, I can use posix_memalign to allocate aligned memory. I can't seem to find a way to get this to work for windows targets; I get errors about undefined references. I have tried several alternative functions, to no avail. Example Code: ``` #include <stdio.h> #include <stdlib.h> #include <malloc.h> int main(void) { char *foo; /* works on linux */ posix_memalign(&foo, 1024, 1024); /* deprecated linux */ memalign(1024, 1024); valloc(1024); /* should work on windows only */ _aligned_malloc(1024, 1024); } ``` Example output for a Linux target (expected): ``` ben@debian6400:~/folder$ gcc --version gcc (Debian 4.4.5-8) 4.4.5 ben@debian6400:~/folder$ gcc -std=c99 test.c test.c: In function ‘main’: test.c:11: warning: implicit declaration of function ‘posix_memalign’ test.c:18: warning: implicit declaration of function ‘_aligned_malloc’ /tmp/ccPwPLsW.o: In function `main': test.c:(.text+0x55): undefined reference to `_aligned_malloc' collect2: ld returned 1 exit status ``` Example output for a Windows target -- note that all four functions are undefined ``` ben@debian6400:~/folder$ i586-mingw32msvc-gcc --version i586-mingw32msvc-gcc (GCC) 4.4.4 ben@debian6400:~/folder$ i586-mingw32msvc-gcc -std=c99 test.c test.c: In function ‘main’: test.c:14: warning: implicit declaration of function ‘posix_memalign’ test.c:17: warning: implicit declaration of function ‘memalign’ test.c:18: warning: implicit declaration of function ‘valloc’ test.c:21: warning: implicit declaration of function ‘_aligned_malloc’ /tmp/ccpH5Dsj.o:test.c:(.text+0x26): undefined reference to `_posix_memalign' /tmp/ccpH5Dsj.o:test.c:(.text+0x3a): undefined reference to `_memalign' /tmp/ccpH5Dsj.o:test.c:(.text+0x46): undefined reference to `_valloc' /tmp/ccpH5Dsj.o:test.c:(.text+0x5a): undefined reference to `__aligned_malloc' collect2: ld returned 1 exit status ``` Any ideas?

Original source