⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autobook_251.html

📁 Autoconf使用手册
💻 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: DLLs with Libtool</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: DLLs with Libtool"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: DLLs with Libtool"><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="SEC251"></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_250.html#SEC250" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: Executable Filename Extensions" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_252.html#SEC252" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: DLL Support with GNU Autotools" ALIGN="MIDDLE" NAME="next"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_257.html#SEC257" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: Package Installation" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_242.html#SEC242" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: Integration with Cygnus Cygwin" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_257.html#SEC257" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: Package Installation" 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"><H2> 25.4 DLLs with Libtool </H2><!--docid::SEC251::--><P>Windows' DLLs, are very different to their nearest equivalent onUnix: shared libraries.  This makes Libtool's job of hiding bothbehind the same abstraction extremely difficult --  it is not fullyimplemented at the time of writing.  As a package author that wants touse DLLs on Windows with Libtool, you must construct your packagesvery carefully to enable them to build and link with DLLs in thesame way that they build and link with shared libraries on Unix.</P><P>Some of the difficulties that must be addressed follow:</P><P><UL><LI>At link time, a DLL effectively consists of two parts; the DLLitself which contains the shared object code, and an import librarywhich consists of the <EM>stub</EM><A NAME="DOCF65" HREF="autobook_fot.html#FOOT65">(65)</A> functions which are actuallylinked into the executable, at a rate of one stub per entry point.  Unixhas a run time loader which links shared libraries into the main programas it is executed, so the shared library is but a single file.<P><LI>Pointer comparisons do not always work as expected when the pointerscross a DLL boundary, since you can be comparing the addresses ofthe stubs in the import library rather than the addresses of the actualobjects in the DLL.  GCC provides the <CODE>__declspec</CODE>extension to alleviate this problem a little.<P><LI>The search algorithm for the runtime library loader is very different tothe algorithms typically used on Unix; I'll explain how to dela withthis in <A HREF="autobook_256.html#SEC256">25.4.5 Runtime Loading of DLLs</A>.<P><LI>All of the symbols required by a DLL at runtime, must be resolved atlink time.  With some creative use of import libraries, it is usuallypossible to work around this shortcoming, but it is easy to forget thislimitation if you are developing on a modern system which has lazysymbol resolution.  Be sure to keep it at the back of your mind if youintend to have your package portable to Windows.<P><LI>Worst of all, is that it is impossible to reference a non-pointer itemimported from a DLL.  In practice, when you think you have exported adata item from a DLL, you are actually exporting it's address (in factthe address of the address if you take the import library intoconsideration), and it is necessary to add an extra level of indirectionto any non-pointers imported from a DLL to take this into account.  TheGNU gcc <CODE>__declspec</CODE> extension can handle this automaticallytoo, at the expense of obfuscating your code a little.</UL><P>Cygwin support in Libtool is very new, and is being developed veryquickly, so newer versions generally improve vastly over theirpredecessors when it comes to Cygwin, so you should get the newestrelease you can.  The rest of this section is correct with respect toLibtool version 1.3.5.</P><P>In some future version, Libtool might be able to work as transparentlyas Autoconf and Automake, but for now designing your packages asdescribed in this chapter will help Libtool to help us have DLLsand Unix shared libraries from the same codebase.</P><P>The bottom line here is that setting a package up to build and usemodules and libraries as both DLLs <EM>and</EM> Unix shared librariesis not straightforward, but the rest of this section provides a recipewhich I have used successfully in several projects, including the moduleloader for GNU <CODE>m4</CODE> 1.5 which works correctly withDLLs on Windows.  Lets create <EM>hello world</EM> as a DLL, andan executable where the runtime loader loads the DLL.</P><P><A NAME="DLL Support with GNU Autotools"></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 + -