diff options
Diffstat (limited to 'winsup/doc/gcc.xml')
-rw-r--r-- | winsup/doc/gcc.xml | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/winsup/doc/gcc.xml b/winsup/doc/gcc.xml new file mode 100644 index 000000000..b9039db96 --- /dev/null +++ b/winsup/doc/gcc.xml @@ -0,0 +1,160 @@ +<?xml version="1.0" encoding='UTF-8'?> +<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook V4.5//EN" + "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"> + +<sect1 id="gcc"><title>Using GCC with Cygwin</title> + +<sect2 id="gcc-cons"><title>Console Mode Applications</title> + +<para>Use gcc to compile, just like under UNIX. +Refer to the GCC User's Guide for information on standard usage and +options. Here's a simple example:</para> + +<example id="gcc-hello-world"> +<title>Building Hello World with GCC</title> +<screen> +<prompt>bash$</prompt> <userinput>gcc hello.c -o hello.exe</userinput> +<prompt>bash$</prompt> <userinput>hello.exe</userinput> +Hello, World + +<prompt>bash$</prompt> +</screen> +</example> + +</sect2> + +<sect2 id="gcc-gui"><title>GUI Mode Applications</title> + +<para>Cygwin allows you to build programs with full access to the +standard Windows 32-bit API, including the GUI functions as defined in +any Microsoft or off-the-shelf publication. However, the process of +building those applications is slightly different, as you'll be using +the GNU tools instead of the Microsoft tools.</para> + +<para>For the most part, your sources won't need to change at all. +However, you should remove all __export attributes from functions +and replace them like this:</para> + +<screen> +int foo (int) __attribute__ ((__dllexport__)); + +int +foo (int i) +</screen> + +<para>The Makefile is similar to any other UNIX-like Makefile, +and like any other Cygwin makefile. The only difference is that you use +<command>gcc -mwindows</command> to link your program into a GUI +application instead of a command-line application. Here's an example:</para> + +<screen> +<![CDATA[ +myapp.exe : myapp.o myapp.res + gcc -mwindows myapp.o myapp.res -o $@ + +myapp.res : myapp.rc resource.h + windres $< -O coff -o $@ +]]> +</screen> + +<para>Note the use of <filename>windres</filename> to compile the +Windows resources into a COFF-format <filename>.res</filename> file. +That will include all the bitmaps, icons, and other resources you +need, into one handy object file. Normally, if you omitted the "-O +coff" it would create a Windows <filename>.res</filename> format file, +but we can only link COFF objects. So, we tell +<filename>windres</filename> to produce a COFF object, but for +compatibility with the many examples that assume your linker can +handle Windows resource files directly, we maintain the +<filename>.res</filename> naming convention. For more information on +<filename>windres</filename>, consult the Binutils manual. </para> + +<para> +The following is a simple GUI-mode "Hello, World!" program to help +get you started: +<screen> +/*-------------------------------------------------*/ +/* hellogui.c - gui hello world */ +/* build: gcc -mwindows hellogui.c -o hellogui.exe */ +/*-------------------------------------------------*/ +#include <windows.h> + +char glpszText[1024]; + +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); + +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + sprintf(glpszText, + "Hello World\nGetCommandLine(): [%s]\n" + "WinMain lpCmdLine: [%s]\n", + lpCmdLine, GetCommandLine() ); + + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(wcex); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = NULL; + wcex.lpszClassName = "HELLO"; + wcex.hIconSm = NULL; + + if (!RegisterClassEx(&wcex)) + return FALSE; + + HWND hWnd; + hWnd = CreateWindow("HELLO", "Hello", WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); + + if (!hWnd) + return FALSE; + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return msg.wParam; +} + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + HDC hdc; + + switch (message) + { + case WM_PAINT: + hdc = BeginPaint(hWnd, &ps); + RECT rt; + GetClientRect(hWnd, &rt); + DrawText(hdc, glpszText, strlen(glpszText), &rt, DT_TOP | DT_LEFT); + EndPaint(hWnd, &ps); + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} +</screen> +</para> + +</sect2> +</sect1> |