Как скомпилировать существующий код posix для 64-битной Windows?
Вопрос
Я согласен использовать Cygwin или MinGW, но мне нужно получить 64-битный код, а не 32-битный.Это потому, что я буду вызывать DLL из 64-разрядного управляемого C#.Кажется, я не могу найти хороших ссылок по настройке этих инструментов для создания 64-битных двоичных файлов.Кроме того, было бы неплохо, если бы GCC был версии 4, а не версии 3, как в моей установке Cygwin.
Альтернативой может быть некоторая форма межпроцессного взаимодействия.Я исследую это, но то, что я изложил выше, — это то, чего я действительно хочу.
Решение
А 64-битный МинГВ, основанный на (только что выпущенном) gcc-4.4.0, вероятно, будет лучшим выбором.(Поскольку проект mingw-w64 на sourceforge.net переезжает на mingw-w64.org, лучше использовать mingw-w64.org)
Подробные инструкции:
1.Загрузите архив
2.Распакуйте его куда-нибудь под Cygwin.В моем случае каталог cygwin верхнего уровня: C:\cygwin
, я извлек пакет в mingw
каталог и в итоге получил следующее содержимое в C:\cygwin\mingw
(что видно как /mingw
под 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.Теперь скомпилируйте код C++.Я использовал:
// t.cc
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> vs;
vs.push_back("abc");
}
И скомпилируйте это так:
$ /mingw/bin/x86_64-pc-mingw32-g++ t.cc
4.Наконец, убедитесь, что результат является исполняемым файлом Windows/x 64, запустив 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
Другие советы
А документация gcc сказать:
Эти переключатели «-m» поддерживаются в дополнение к вышеуказанному на процессорах AMD x86-64 в 64-битных средах.
-M32 -M64 Сгенерировать код для 32-битной или 64-битной среды.32-разрядная среда устанавливает Int, Long и указатель на 32 бит и генерирует код, который работает в любой системе I386.64-разрядная среда устанавливает INT до 32 бит и длиной и указан на 64 бит и генерирует код для архитектуры AMD X86-64.
Обратите внимание, что это сведет вас с ума, я думаю, если Mingw действительно делает это так, поскольку обычно в Windows 64 Long-32 бита, а длинный-64-битный тип размера указателя.