Wiki

Компиляция и сборка с MinGW

Как создать консольное приложение

Следующий образец кода простой программы C. Вырежьте и вставьте его в файл hello.c.
#include <stdio.h>
 
int main(int argc, char **argv)
{
     printf ("Hello\n");
     return (0);
}
Если Вы хотите создать консольный исполняемый файл hello.exe, при компиляции файла hello.c, сделайте следующее:    gcc -c hello.c Компиляция hello.o из hello.c:    gcc -o hello hello.o Создание исполняемого файла hello.exe из hello.o.    gcc -o hello hello.c Следующий образец кода простой программы C++. Вырежьте и вставьте его в файл hello.cpp.
#include <iostream>
int main(int argc, char **argv)
{
      std::cout << "Hello" << std::endl;
      return (0);
}
Для С++ программ используйте слудующий метод компиляции:
g++ -c hello.cpp
g++ -o hello hello.o

Как создать Windows приложение

Следующий образец кода простого Windows приложения. Вырежьте и вставьте его в файл hello.c.
#include <windows.h>
 
int WINAPI WinMain (HINSTANCE hInstance, 
                                 HINSTANCE hPrevInstance, 
                                 PSTR szCmdLine, 
                                 int iCmdShow) 
{
      MessageBox (NULL, "Hello", "Hello Demo", MB_OK);
      return (0);
}
Если вам нужно создать исполняемый Windows файл hello.exe, из файла hello.c, сделайте следующее:    gcc -c hello.c Компиляция hello.o из hello.c:    gcc -o hello hello.o -mwindows В данном примере мы создаем hello.exe из hello.o, флаг -mwindows необходим, чтобы создать Windows-приложение, а не консольное. Этим мы говорим компилятору, что нужно подключить соответствующие библиотеки. Чтобы получить консольный экран наряду со стандартным приложением Windows, добавьте -mconsole флаг так же как -mwindows. Если Вы используете файл ресурсов (.rc), и его также нужно добавить к вашему приложению, то его нужно включить так же как другие исходные файлы. Вот пример, который показывает, как собрать приложение с файлом ресурса, resfile.rc.
windres -o resfile.o resfile.rc
gcc -o hello hello.o resfile.o -mwindows

Как создать dll

Пример. Вырежьте и вставьте его в файл dllfct.h.
#ifdef BUILD_DLL
   // the dll exports
   #define EXPORT __declspec(dllexport)
#else
   // the exe imports
   #define EXPORT __declspec(dllimport)
#endif
 
// function to be imported/exported
EXPORT void tstfunc (void);
Вырежьте и вставьте его в файл dllfct.c.
#include <stdio.h>
#include "dllfct.h"
 
EXPORT void tstfunc (void)
{
      printf ("Hello\n");
}
Вырежьте и вставьте его в файл hello.c.
#include "dllfct.h"
 
int main ()
{
      tstfunc ();
      return (0);
}
Чтобы создать dll и связать с ней exe файл, нужно сделать следующее:
gcc -c hello.c
gcc -c -DBUILD_DLL dllfct.c
gcc -shared -o tst.dll -Wl,--out-implib,libtstdll.a dllfct.o
gcc -o hello.exe hello.o -L./ -ltstdll
Для дополнительной информации о использовании dll, смотрите http://www.nanotech.wisc.edu/~khan/software/gnu-win32/dllhelpers.html

Как создать def файл для dll

Есть несколько методов как можно это сделать.
  • Первый, с помощью утилиты pexports, которая предоставляется с пакетом MinGW (mingw-utils). Смотрите на сайте mingw. Если ваша dll используемыет stdcall функции, вам нужно использовать -o флаг.
  • Другой, с помошью утилиты impdef. Множество инструкций о том как создать def файл из dll, скопировать impdef и множество информации о ее использовании доступно на сайте Колина Петерса (Colin Peters). Смотрите раздел Tutorials.
  • Третий, использование nm, которая также поставляется с пакетом MinGW. Этот метод работает не со всеми dll файлами, проблемы могут быть с dll, которые не импортируют функций или скомпилированы как 16 битные. Для использования данной технологии вам понадобится фильтр вывода из nm для создания def файла. Это может быть сделано вручную в редакторе или автоматизировано с помощью таких инструментов как Perl (Practical Extraction and Report Language) или grep (global regular expression print) и sed (stream editor). Даже автоматизировав процесс, может понадобиться сделать некоторыми изменениями вручную, если в dll используется stdcall. Для более детального ознакомления смотрите сайт Колина Питерса (Colin Peters). (Версии sed и grep доступны на различных сайтах содержащих архивы. Версия ActiveState Perl хорошо работает на платформах Win32.) Вот - примеры возможных методов фильтрования.
    • Этот пример использует grep и sed. Если у Вас есть файл file.dll, для которого вы хотите создать файл file.def, сделайте следующее:
      echo EXPORTS > file.def
      nm file.dll | grep ' T _' | sed 's/.* T _//' >> file.def
      Для создания файла file.a из dll и def файлов, нужно:    dlltool --def file.def --dllname file.dll --output-lib file.a
    • В этом примере используется Perl. Скопируйте данный скрипт в файл dll.pl и запустите его.
      open (OUTFILE,">dll.def");
      print OUTFILE "EXPORTS\n";
      open (INFILE,"dll.fil");
      while(<INFILE>)
      {
            if ($_ =~ /T _/)
            {
               $line = $_;
               $line =~ s/.* T _//;
               print OUTFILE $line;
            }
      }
      close (INFILE);
      close (OUTFILE);
      Если у Вас есть файл file.dll. Запустите команду:
      nm file.dll > dll.fil
      perl dll.pl
      Создастся def файл названный dll.def. Вы можете его переименовать как хотите. Можно также удалить dll.fil.
  • Если Вы не имеете ни одного из этих инструментов, то можете воспольщоваться nm, чтобы создать def файл и редактировать его вручную через редактор. Например:
    nm file.dll > dll.fil
    find " T _" dll.fil > dll.def
    Replace the line at the top of dll.def that was created by the find program and shows a file name with a line that says EXPORTS. Set your editor to search for T _ and erase it and anything on the line before it, leaving only the routine names in the file.
  • Если предыдущие варианты не работают, Вы можете все еще попробовать создать def файл, используя objdump ( из пакета MinGW). Вот - пример.
    objdump -p file.dll > dll.fil
    Вы найдете в файле dll.fil таблицу [Ordinal/Name Pointer] со списком экспортируемых вами функций, чтобы создать ваш def файл. Ищите [Ordinal/Name Pointer] таблица в dll.fil и используйте полученный список для создания вашего def файла.

Источник: http://www.mingw.org/docs.shtml Перевод: Ершов Эдуард