diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-02-11 18:22:50 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-02-11 18:22:50 +0000 |
commit | c2da1d6ebff2be2e038153ab41bb6dae04ea5574 (patch) | |
tree | 6a56d3031a31e79e686df1e396f9fb46d5cf116e /winsup/doc/faq-programming.xml | |
parent | bb549dfed818113e0ff2e2a0183d5aae62b45b1b (diff) | |
download | cygnal-c2da1d6ebff2be2e038153ab41bb6dae04ea5574.tar.gz cygnal-c2da1d6ebff2be2e038153ab41bb6dae04ea5574.tar.bz2 cygnal-c2da1d6ebff2be2e038153ab41bb6dae04ea5574.zip |
* faq-programming.xml: Revamp (mostely) for Cygwin 1.7.
* faq-what.xml: Ditto.
Diffstat (limited to 'winsup/doc/faq-programming.xml')
-rw-r--r-- | winsup/doc/faq-programming.xml | 139 |
1 files changed, 50 insertions, 89 deletions
diff --git a/winsup/doc/faq-programming.xml b/winsup/doc/faq-programming.xml index 9e6fee6de..948c59d52 100644 --- a/winsup/doc/faq-programming.xml +++ b/winsup/doc/faq-programming.xml @@ -62,11 +62,10 @@ would be difficult. <question><para>Where is Objective C?</para></question> <answer> -<para>Objective C is not distributed with the Cygwin version of gcc, and there -are no plans to do so. The gcc package maintainer had difficulty -building it, and once built there were problems using it. It appears -that there is only minimal support for the Objective C front-end in the -main GCC distribution, anyway. +<para>Objective C hasn't been distributed with the Cygwin version of gcc +for a long time. For several reason Cygwin was stuck with gcc version 3.4.4. +Fortunately the latest gcc maintainer is quite busy to create a working +gcc 4.x release which also comes with an Objective C package. </para> </answer></qandaentry> @@ -87,22 +86,27 @@ to enable cygexec for all executables in that folder; you will also need to exclude non-cygwin executables with the -x switch. Enabling cygexec causes cygwin executables to talk directly to one another, which increases the command-line limit. To enable cygexec for <literal>/bin</literal> and -<literal>/usr/bin</literal>, you can use these commands in a batch file: +<literal>/usr/bin</literal>, you can add or change these entries in /etc/fstab: </para> <screen> -mount -X -b -f c:\cygwin\bin /bin -mount -X -b -f c:\cygwin\bin /usr/bin -mount -x -b -f c:\cygwin\bin\tclsh84.exe /usr/bin/tclsh84.exe -mount -x -b -f c:\cygwin\bin\tclsh84.exe /bin/tclsh84.exe -mount -x -b -f c:\cygwin\bin\wish84.exe /usr/bin/wish84.exe -mount -x -b -f c:\cygwin\bin\wish84.exe /bin/wish84.exe +C:/cygwin/bin /bin ntfs binary,cygexec 0 0 +C:/cygwin/bin /usr/bin ntfs binary,cygexec 0 0 </screen> -<para>Note that if you have Tcl/Tk installed, you must specifically exclude -<literal>tclsh84</literal> and <literal>wish84</literal>, which are linked -to the Cygwin DLL but are not actually Cygwin programs. If you have added -other non-Cygwin programs to a path you want to mount cygexec, you can find -them with a script like this: +<para>Note that if you have Tcl/Tk installed, you must additionally +exclude <literal>tclsh84</literal> and <literal>wish84</literal>, which +are linked to the Cygwin DLL but are not actually Cygwin programs: +</para> + +<screen> +C:/cygwin/bin/tclsh84.exe /bin/tclsh84.exe ntfs binary,notexec 0 0 +C:/cygwin/bin/tclsh84.exe /usr/bin/tclsh84.exe ntfs binary,notexec 0 0 +C:/cygwin/bin/wish84.exe /bin/wish84.exe ntfs binary,notexec 0 0 +C:/cygwin/bin/wish84.exe /usr/bin/wish84.exe ntfs binary,notexec 0 0 +</screen> + +<para>If you have added other non-Cygwin programs to a path you want to mount +cygexec, you can find them with a script like this: </para> <screen> #!/bin/sh @@ -112,7 +116,7 @@ done </screen> <para> -See <ulink url="http://www.cygwin.com/cygwin-ug-net/using-utils.html#mount" /> +See <ulink url="http://cygwin.com/cygwin-ug-net/using.html#mount-table" /> for more information on using mount. </para> @@ -125,7 +129,7 @@ error?</para></question> <para> Try running cygserver. Read -<ulink url="http://www.cygwin.com/cygwin-ug-net/using-cygserver.html" />. If you're +<ulink url="http://cygwin.com/cygwin-ug-net/using-cygserver.html" />. If you're trying to use PostgreSQL, also read <literal>/usr/share/doc/Cygwin/postgresql-*.README</literal>. </para> @@ -168,8 +172,6 @@ gcj --main=Hello Hello.java <question><para>How do I use Win32 API calls?</para></question> <answer> -<para><emphasis role='bold'>(Please note: This section has not yet been updated for the latest net release.)</emphasis> -</para> <para>It's pretty simple actually. Cygwin tools require that you explicitly link the import libraries for whatever Win32 API functions that you are going to use, with the exception of kernel32, which is linked @@ -184,38 +186,13 @@ with gdi32 like this: </para> <para>gcc -o foo.exe foo.c bar.c -lgdi32 </para> -<para>The following libraries are available for use in this way: -</para> -<para>advapi32 largeint ole32 scrnsave vfw32 -cap lz32 oleaut32 shell32 win32spl -comctl32 mapi32 oledlg snmp winmm -comdlg32 mfcuia32 olepro32 svrapi winserve -ctl3d32 mgmtapi opengl32 tapi32 winspool -dlcapi mpr penwin32 th32 winstrm -gdi32 msacm32 pkpd32 thunk32 wow32 -glaux nddeapi rasapi32 url wsock32 -glu32 netapi32 rpcdce4 user32 wst -icmp odbc32 rpcndr uuid -imm32 odbccp32 rpcns4 vdmdbg -kernel32 oldnames rpcrt4 version -</para> <para>The regular setup allows you to use the option -mwindows on the command line to include a set of the basic libraries (and also make your program a GUI program instead of a console program), including user32, gdi32 and, IIRC, comdlg32. </para> -<para>Note that you should never include -lkernel32 on your link line -unless you are invoking ld directly. Do not include the same import -library twice on your link line. Finally, it is a good idea to -put import libraries last on your link line, or at least after -all the object files and static libraries that reference them. -</para> -<para>The first two are related to problems the linker has (as of b18 at least) -when import libraries are referenced twice. Tables get messed up and -programs crash randomly. The last point has to do with the fact that -gcc processes the files listed on the command line in sequence and -will only resolve references to libraries if they are given after -the file that makes the reference. +<para>It is a good idea to put import libraries last on your link line, +or at least after all the object files and static libraries that reference them. </para> </answer></qandaentry> @@ -223,6 +200,8 @@ the file that makes the reference. <question><para>How do I compile a Win32 executable that doesn't use Cygwin?</para></question> <answer> +<para><emphasis role='bold'>(Please note: This section has not yet been updated for the latest net release.)</emphasis> +</para> <para>The -mno-cygwin flag to gcc makes gcc link against standard Microsoft DLLs instead of Cygwin. This is desirable for native Windows programs that don't need a UNIX emulation layer. @@ -297,8 +276,8 @@ have our own Win32 headers which are pretty complete. <answer> <para>Before you begin, note that Cygwin is licensed under the GNU GPL (as -indeed are all other Cygwin-based libraries). That means that if your -code links against the cygwin dll (and if your program is calling +indeed are many other Cygwin-based libraries). That means that if your +code links against the Cygwin dll (and if your program is calling functions from Cygwin, it must, as a matter of fact, be linked against it), you must apply the GPL to your source as well. Of course, this only matters if you plan to distribute your program in binary form. For @@ -531,18 +510,7 @@ gcc as: <para><literal>cygcheck</literal> will do this much more concisely, and operates recursively, provided the command is in your path. </para> -<para>Note there is currently a bug in cygcheck in that it will not report -on a program in a Windows system dir (e.g., C:\Windows or C:\WINNT) even -if it's in your path. To work around this, supply the full Win32 path -to the executable, including the .exe extension: -</para> -<screen> -cygcheck c:\\winnt\\system32\\cmd.exe -</screen> -<para>(Note the windows path separator must be escaped if this is typed in -bash.) -</para> </answer></qandaentry> <qandaentry id="faq.programming.dll-building"> @@ -569,7 +537,7 @@ question. <question><para>How can I build a relocatable dll?</para></question> <answer> -<para><emphasis role='bold'>(Please note: This section has not yet been updated for the latest net release. However, there was a discussion on the cygwin mailing list recently that addresses this issue. Read <ulink url="http://cygwin.com/ml/cygwin/2000-06/msg00688.html">http://cygwin.com/ml/cygwin/2000-06/msg00688.html</ulink> and related messages.)</emphasis> +<para><emphasis role='bold'>(Please note: This section has not yet been updated for the latest net release. However, there was a discussion on the cygwin mailing list once that addresses this issue. Read <ulink url="http://cygwin.com/ml/cygwin/2000-06/msg00688.html">http://cygwin.com/ml/cygwin/2000-06/msg00688.html</ulink> and related messages.)</emphasis> </para> <para>You must execute the following sequence of five commands, in this order: @@ -689,7 +657,7 @@ info would not be compatible with gdb). <para>Yes. You can use the <literal>strace.exe</literal> utility to run other cygwin programs with various debug and trace messages enabled. For information on using <literal>strace</literal>, see the Cygwin User's Guide or the file -<literal>winsup/utils/utils.sgml</literal>. +<literal>winsup/utils/utils.sgml</literal> in the Cygwin sources. </para> </answer></qandaentry> @@ -722,7 +690,7 @@ This is right <literal>gcc hello.cc -lstdc++</literal>. <answer> <para><literal>struct stat64</literal> is not used in Cygwin, just -use <literal>struct stat</literal>.</para> +use <literal>struct stat</literal>. It's 64 bit aware.</para> </answer></qandaentry> <qandaentry id="faq.programming.undeclared-functions"> @@ -746,9 +714,9 @@ the UNICODE stuff for it isn't filled in. <question><para>Where is malloc.h?</para></question> <answer> -<para><emphasis role='bold'>(Please note: This section has not yet been updated for the latest net release.)</emphasis> -</para> -<para>Include stdlib.h instead of malloc.h. +<para>It exists, but you should rather include stdlib.h instead of malloc.h. +stdlib.h is POSIX standard for defining malloc and friends, malloc.h is +definitely non-standard. </para> </answer></qandaentry> @@ -809,7 +777,7 @@ data types, line numbers, local variables etc. <para>CPU reference manuals for Intel's current chips are available in downloadable PDF form on Intel's web site: </para> -<para><ulink url="http://developer.intel.com/design/pro/manuals/">http://developer.intel.com/design/pro/manuals/</ulink> +<para><ulink url="http://developer.intel.com/">http://developer.intel.com/</ulink> </para> </answer></qandaentry> @@ -818,41 +786,34 @@ downloadable PDF form on Intel's web site: <answer> <para>If your scripts are in the current directory, you must have <literal>.</literal> -(dot) in your $PATH. (It is not normally there by default.) Otherwise, -you would need to add /bin/sh in front of each and every shell script -invoked in your Makefiles. +(dot) in your $PATH. (It is not normally there by default.) Better yet, +add /bin/sh in front of each and every shell script invoked in your Makefiles. </para> </answer></qandaentry> <qandaentry id="faq.programming.preprocessor"> -<question><para>What preprocessor do I need to know about?</para></question> +<question><para>What preprocessor macros do I need to know about?</para></question> <answer> -<para>We use _WIN32 to signify access to the Win32 API and __CYGWIN__ for -access to the Cygwin environment provided by the dll. +<para>gcc for Cygwin defines __CYGWIN__ when building for a Cygwin +environment. </para> -<para>We chose _WIN32 because this is what Microsoft defines in VC++ and -we thought it would be a good idea for compatibility with VC++ code -to follow their example. We use _MFC_VER to indicate code that should -be compiled with VC++. +<para>Microsoft defines the preprocessor symbol _WIN32 in their Windows +development environment. </para> -<para>_WIN32 is only defined when you use either the -mno-cygwin or -mwin32 +<para>In gcc for Cygwin, _WIN32 is only defined when you use the -mwin32 gcc command line options. This is because Cygwin is supposed to be a -Unix emulation environment and defining _WIN32 confuses some programs -which think that they have to make special concessions for a Windows -environment which Cygwin handles automatically. +POSIX emulation environment in the first place and defining _WIN32 confuses +some programs which think that they have to make special concessions for +a Windows environment which Cygwin handles automatically. </para> -<para>Note that using -mno-cygwin replaces __CYGWIN__ with __MINGW32__ as to -tell which compiler (or settings) you're running. -Check this out in detail by running, for example +<para>Check out the predefined symbols in detail by running, for example </para> <screen> $ gcc -dM -E -xc /dev/null >gcc.txt - $ gcc -mno-cygwin -dM -E -xc /dev/null >gcc-mno-cygwin.txt $ gcc -mwin32 -dM -E -xc /dev/null >gcc-mwin32.txt </screen> -<para>Then use the diff and grep utilities to check -what the difference is. +<para>Then use the diff and grep utilities to check what the difference is. </para> </answer></qandaentry> @@ -866,7 +827,7 @@ what the difference is. V (and others?). Typically, you will end up with a GUI on Windows that requires some runtime support. With tcl/tk, you'll want to include the necessary library files and the tcl/tk DLLs. In the case of X11, you'll -need everyone using your program to have an X11 server installed. +need everyone using your program to have the X11 server installed. </para> <para>The second method is to rewrite your GUI using Win32 API calls (or MFC with VC++). If your program is written in a fairly modular fashion, you |