Undefined reference to posix_memalign using mingw32

11,241

Solution 1

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.

Solution 2

The GNU page for Gnulib says this function is missing on mingw platform and they suggest to use Gnulib pagealign_alloc function on these platforms.

(8.632, posix_memalign) This function is missing on some platforms: MacOS X 10.5, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, MSVC 9, Interix 3.5, BeOS.

and

The Gnulib module pagealign_alloc provides a similar API that returns memory aligned on a system page boundary.

http://www.gnu.org/software/gnulib/manual/html_node/posix_005fmemalign.html

Note that on C11, there is a new function named align_alloc where the alignment can be specified:

#include <stdlib.h>
void *aligned_alloc(size_t alignment, size_t size);
Share:
11,241
HoboBen
Author by

HoboBen

Updated on June 04, 2022

Comments

  • HoboBen
    HoboBen almost 2 years

    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?