How to compile existing posix code for 64-bit Windows?

前端 未结 2 1242
予麋鹿
予麋鹿 2021-02-06 12:32

I\'m ok with using Cygwin or MinGW, but I need to end up with 64-bit code, not 32-bit. This is because I will be calling the DLL from 64-bit managed C#. I can\'t seem to find

相关标签:
2条回答
  • 2021-02-06 12:58

    The gcc docs say:

    These `-m' switches are supported in addition to the above on AMD x86-64 processors in 64-bit environments.

    -m32 -m64 Generate code for a 32-bit or 64-bit environment. The 32-bit environment sets int, long and pointer to 32 bits and generates code that runs on any i386 system. The 64-bit environment sets int to 32 bits and long and pointer to 64 bits and generates code for AMD's x86-64 architecture.

    Note that that's going to drive you crazy, I think, if mingw really does it that way, since normally on Windows 64 long is 32 bits and long long is the 64-bit pointer-sized type.

    0 讨论(0)
  • 2021-02-06 13:17

    The 64-bit MinGW, based on (just released) gcc-4.4.0, is probably your best bet. (Since the mingw-w64 project on sourceforge.net is moving to mingw-w64.org it's better to use mingw-w64.org)

    Detailed instructions:
    1. Download the archive
    2. Extract it somewhere under cygwin. In my case, top-level cygwin directory is C:\cygwin, I extracted the package into mingw directory, and ended up with the following contents in C:\cygwin\mingw (which is visible as /mingw under cygwin:

    $ ls -l /mingw
    total 1
    drwxr-xr-x+ 2 user None  0 May 10 08:32 bin
    drwxr-xr-x+ 2 user None  0 May 10 05:45 include
    drwxr-xr-x+ 2 user None  0 May 10 08:30 info
    drwxr-xr-x+ 3 user None  0 May 10 08:30 lib
    drwxr-xr-x+ 3 user None  0 May 10 05:45 libexec
    drwxr-xr-x+ 4 user None  0 May 10 05:45 man
    lrwxrwxrwx  1 user None 17 May 17 17:20 mingw -> x86_64-pc-mingw32
    drwxr-xr-x+ 3 user None  0 May 10 04:16 share
    drwxr-xr-x+ 5 user None  0 May 10 04:18 x86_64-pc-mingw32
    

    3. Now compile some C++ code. I used:

    // t.cc
    #include <vector>
    #include <string>
    
    using namespace std;
    int main()
    {
        vector<string> vs;
        vs.push_back("abc");
    }
    

    And compile it like this:

    $ /mingw/bin/x86_64-pc-mingw32-g++ t.cc
    

    4. Finally, verify the result is a Windows/x 64 executable, by running dumpbin /headers a.exe:

    Microsoft (R) COFF/PE Dumper Version 7.00.9466
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    
    Dump of file a.exe
    
    PE signature found
    
    File Type: EXECUTABLE IMAGE
    
    FILE HEADER VALUES
                8664 machine (AMD64)
                  10 number of sections
            4A10AF9F time date stamp Sun May 17 17:45:19 2009
               ABA00 file pointer to symbol table
                 EC4 number of symbols
                  F0 size of optional header
                  27 characteristics
                       Relocations stripped
                       Executable
                       Line numbers stripped
                       Application can handle large (>2GB) addresses
    
    0 讨论(0)
提交回复
热议问题