Как создать консольное приложение
Следующий образец кода простой программы 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
Перевод: Ершов Эдуард