📄 autobook_151.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: Template Instantiation</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: Template Instantiation"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: Template Instantiation"><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="SEC151"></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_150.html#SEC150" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: Compiler Quirks" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_152.html#SEC152" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: Name Mangling" 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_153.html#SEC153" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: How GNU Autotools Can Help" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_150.html#SEC150" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: Compiler Quirks" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_153.html#SEC153" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: How GNU Autotools Can Help" 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> 16.3.1 Template Instantiation </H3><!--docid::SEC151::--><P>The problem with template instantiation exists because of a number ofcomplex constraints:</P><P><UL><LI>The compiler should only generate an instance of a template once,to speed the compilation process.<LI>The linker needs to be smart about where to locate the object code forinstantiations produced by the compiler.</UL><P>This problem is exacerbated by separate compilation--that is, the methodbodies for <CODE>List<T></CODE> may be located in a header file or in aseparate compilation unit. These files may even be in a differentdirectory than the current directory!</P><P>Life is easy for the compiler when the template definition appears inthe same compilation unit as the site of the instantiation--everythingthat is needed is known:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>template <class T> class List{private: T* head; T* current;};List<int> li;</pre></td></tr></table></P><P>This becomes significantly more difficult when the site of a templateinstantiation and the template definition is split between two differentcompilation units. In <CITE>Linkers and Loaders</CITE>, Levine describes indetail how the compiler driver deals with this by iteratively attemptingto link a final executable and noting, from <SAMP>`undefined symbol'</SAMP>errors produced by the linker, which template instantiations must beperformed to successfully link the program.</P><P>In large projects where templates may be instantiated in multiplelocations, the compiler may generate instantiations multiple times forthe same type. Not only does this slow down compilation, but it canresult in some difficult problems for linkers which refuse to linkobject files containing duplicate symbols. Suppose there is thefollowing directory layout:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>src|`--- core| `--- core.cxx`--- modules| `--- http.cxx`--- lib `--- stack.h</pre></td></tr></table></P><P>If the compiler generates <TT>`core.o'</TT> in the <TT>`core'</TT> directory and<TT>`libhttp.a'</TT> in the <TT>`http'</TT> directory, the final link may failbecause <TT>`libhttp.a'</TT> and the final executable may contain duplicatesymbols--those symbols generated as a result of both <TT>`http.cxx'</TT> and<TT>`core.cxx'</TT> instantiating, say, a <CODE>Stack<int></CODE>. Linkers, suchas that provided with AIX will allow duplicate symbols during alink, but many will not.</P><P>Some compilers have solved this problem by maintaining a templaterepository of template instantiations. Usually, the entire templatedefinition is expanded with the specified type parameters and compiledinto the repository, leaving the linker to collect the required objectfiles at link time.</P><P>The main concerns about non-portability with repositories center aroundgetting your compiler to do the right thing about maintaining a singlerepository across your entire project. This often requires avendor-specific command line option to the compiler, which can detractfrom portability. It is conceivable that Libtool could come to therescue here in the future.</P><P><A NAME="Name Mangling"></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 + -