📄 autobook_246.html
字号:
<HTML><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><!-- Created on September, 12 2004 by texi2html 1.64 --><!-- Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) Karl Berry <karl@freefriends.org> Olaf Bachmann <obachman@mathematik.uni-kl.de> and many others.Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>Send bugs and suggestions to <texi2html@mathematik.uni-kl.de> --><HEAD><TITLE>Autoconf, Automake, and Libtool: Text vs Binary Modes</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: Text vs Binary Modes"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: Text vs Binary Modes"><META NAME="resource-type" CONTENT="document"><META NAME="distribution" CONTENT="global"><META NAME="Generator" CONTENT="texi2html 1.64"><script language="Javascript"><!-- // Check the browser version. function checkVersion() { if (navigator.appVersion.charAt(0)>=3) return true; if (navigator.appVersion.charAt(0)>=4) return true; else return false; } if (checkVersion()) { homeon = new Image(); homeon.src = "homeon.png"; homeoff = new Image(); homeoff.src = "home.png"; tocon = new Image(); tocon.src = "tocon.png"; tocoff = new Image(); tocoff.src = "toc.png"; indexon = new Image(); indexon.src = "indexon.png"; indexoff = new Image(); indexoff.src = "index.png"; helpon = new Image(); helpon.src = "helpon.png"; helpoff = new Image(); helpoff.src = "help.png"; backon = new Image(); backon.src = "backon.png"; backoff = new Image(); backoff.src = "back.png"; forwardon = new Image(); forwardon.src = "forwardon.png"; forwardoff = new Image(); forwardoff.src = "forward.png"; prevon = new Image(); prevon.src = "prevon.png"; prevoff = new Image(); prevoff.src = "prev.png"; nexton = new Image(); nexton.src = "nexton.png"; nextoff = new Image(); nextoff.src = "next.png"; upon = new Image(); upon.src = "upon.png"; upoff = new Image(); upoff.src = "up.png"; } function img_act(imgName) { if (checkVersion()) { imgOn = eval(imgName + "on.src"); document [imgName].src = imgOn; } } function img_inact(imgName) { if (checkVersion()) { imgOff = eval(imgName + "off.src"); document [imgName].src = imgOff; } }// --></SCRIPT></HEAD><BODY LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#6688AA" VLINK="#336688" ALINK="#808080"><A NAME="SEC246"></A><TABLE BORDER=0 CELLPADDING=0 CELLSPACING=10><TR VALIGN="TOP"><TD ALIGN="MIDDLE" WIDTH=50 BGCOLOR="#e6e6e6"><TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_245.html#SEC245" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: Writing A Cygwin Friendly Package" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_247.html#SEC247" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: File System Limitations" ALIGN="MIDDLE" NAME="next"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"> <TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_251.html#SEC251" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: DLLs with Libtool" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_245.html#SEC245" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: Writing A Cygwin Friendly Package" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_251.html#SEC251" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: DLLs with Libtool" ALIGN="MIDDLE" NAME="forward"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook.html#SEC_Top" onMouseover="img_act('home')" onMouseout="img_inact('home')"><IMG SRC="home.png" BORDER="0" ALT="Top: Autoconf, Automake, and Libtool" ALIGN="MIDDLE" NAME="home"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_toc.html#SEC_Contents" onMouseover="img_act('toc')" onMouseout="img_inact('toc')"><IMG SRC="toc.png" BORDER="0" ALT="Contents: Table of Contents" ALIGN="MIDDLE" NAME="toc"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_285.html#SEC285" onMouseover="img_act('index')" onMouseout="img_inact('index')"><IMG SRC="index.png" BORDER="0" ALT="Index: Index" ALIGN="MIDDLE" NAME="index"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_abt.html#SEC_About" onMouseover="img_act('help')" onMouseout="img_inact('help')"><IMG SRC="help.png" BORDER="0" ALT="About: About this document" ALIGN="MIDDLE" NAME="help"></A></TD></TR></TABLE></TD><TD ALIGN="LEFT"><H3> 25.3.1 Text vs Binary Modes </H3><!--docid::SEC246::--><P>As discussed in <A HREF="autobook_127.html#SEC127">15.3.5.1 Text and Binary Files</A>, text and binary files aredifferent on Windows. Lines in a Windows text files end in acarriage return/line feed pair, but a C program reading the file in textmode will see a single line feed.</P><P>Cygwin has several ways to hide this dichotomy, and the solution(s) youchoose will depend on how you plan to use your program. I will outlinethe relative tradeoffs you make with each choice:</P><P><DL COMPACT><DT>mounting<DD><A NAME="IDX75"></A>Before installing an operating system to your hard drive, you must firstorganise the disk into <EM>partitions</EM>. Under Windows, you might onlyhave a single partition on the disk, which would be called<SAMP>`C:'</SAMP><A NAME="DOCF63" HREF="autobook_fot.html#FOOT63">(63)</A>. Provided that somemedia is present, Windows allows you to access the contents of any driveletter -- that is you can access <SAMP>`A:'</SAMP> when there is a floppy disk inthe drive, and <SAMP>`F:'</SAMP> provided you divided you available drives intosufficient partitions for that letter to be in use. With Unix, thingsare somewhat different: hard disks are still divided into partitions(typically several), but there is only a single filesystem <EM>mounted</EM>under the root directory. You can use the <CODE>mount</CODE> command tohook a partition (or floppy drive or CD-ROM, etc.) into asubdirectory of the root filesystem:<P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>$ mount /dev/fd0 /mnt/floppy$ cd /mnt/floppy</pre></td></tr></table></P><P>Until the directory is <CODE>unmount</CODE>ed, the contents of the floppydisk will be available as part of the single Unix filesystem in thedirectory, <TT>`/mnt/floppy'</TT>. This is in contrast with Windows'multiple root directories which can be accessed by changing filesystemroot -- to access the contents of a floppy disk:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>C:\WINDOWS\> A:A:> DIR...</pre></td></tr></table></P><P>Cygwin has a mounting facility to allow Cygwin applications to see asingle unified file system starting at the root directory, by<CODE>mount</CODE>ing drive letters to subdirectories. When mounting adirectory you can set a flag to determine whether the files in thatpartition should be treated the same whether they are TEXT orBINARY mode files. Mounting a file system to treat TEXT filesthe same as BINARY files, means that Cygwin programs can behave inthe same way as they might on Unix and treat all files as equal.Mounting a file system to treat TEXT files properly, will causeCygwin programs to translate between Windows <FONT SIZE="-1">CR-LF</FONT> line endsequences and Unix <FONT SIZE="-1">CR</FONT> line endings, which plays havoc withfile seeking, and many programs which make assumptions about the size ofa <CODE>char</CODE> in a <CODE>FILE</CODE> stream. However <SAMP>`binmode'</SAMP> is thedefault method because it is the only way to interoperate betweenWindows binaries and Cygwin binaries. You can get a list of which driveletters are mounted to which directories, and the modes they are mountedwith by running the <CODE>mount</CODE> command without arguments:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>BASH.EXE-2.04$ mountDevice Directory Type flagsC:\cygwin / user binmodeC:\cygwin\bin /usr/bin user binmodeC:\cygwin\lib /usr/lib user binmodeD:\home /home user binmode</pre></td></tr></table></P><P>As you can see, the Cygwin <CODE>mount</CODE> command allows you to`mount' arbitrary Windows directories as well as simple drive lettersinto the single filesystem seen by Cygwin applications.</P><P><DT>binmode<DD><A NAME="IDX76"></A>The <CODE>CYGWIN</CODE> environment variable holds a space separated list ofsetup options which exert some minor control over the way the<TT>`cygwin1.dll'</TT> (or <TT>`cygwinb19.dll'</TT> etc.) behaves. One suchoption is the <SAMP>`binmode'</SAMP> setting; if <CODE>CYGWIN</CODE> contains the<SAMP>`binmode'</SAMP> option, files which are opened through <TT>`cygwin1.dll'</TT>without an explicit text or binary mode,will default to binary mode which is closest to how Unix behaves.<P><DT>system calls<DD><A NAME="IDX77"></A><A NAME="IDX78"></A><A NAME="IDX79"></A><A NAME="IDX80"></A><TT>`cygwin1.dll'</TT>, GNU libc and other modern C <FONT SIZE="-1">API</FONT>implementations accept extra flags for <CODE>fopen</CODE> and <CODE>open</CODE> calls todetermine in which mode a file is opened. On Unix it makes nodifference, and sadly most Unix programmers are not aware of thissubtlety, so this tends to be the first thing that needs to be fixed whenporting a Unix program to Cygwin. The best way to use these callsportably is to use the following macros with a package's <TT>`configure.in'</TT>to be sure that the extra arguments are available:</DL><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P>Add the following preprocessor code to a common header file that will beincluded by any sources that use <CODE>fopen</CODE> calls:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>#define fopen rpl_fopen</pre></td></tr></table></P><P>Save the following function to a file, and link that into your programso that in combination with the preprocessor magic above, you can alwaysspecify text or binary mode to <CODE>open</CODE> and <CODE>fopen</CODE>, and letthis code take care of removing the flags on machines which do notsupport them:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P>The correct operation of the file above relies on several things havingbeen checked by the <CODE>configure</CODE> script, so you will also need toensure that the following macros are present in your <TT>`configure.in'</TT>before you use this code:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P><A NAME="File System Limitations"></A></TR></TABLE><BR> <FONT SIZE="-1">This document was generatedby <I>Gary V. Vaughan</I> on <I>September, 12 2004</I>using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html"><I>texi2html</I></A></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -