📄 autobook_170.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: libltdl Dependent Libraries</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: libltdl Dependent Libraries"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: libltdl Dependent Libraries"><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="SEC170"></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_169.html#SEC169" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: libltdl Module Loader" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_171.html#SEC171" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: libltdl Dynamic Module" 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_171.html#SEC171" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: libltdl Dynamic Module" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_166.html#SEC166" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: Using libltdl" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_172.html#SEC172" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: Portable Library Design" 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> 18.2.4 Dependent Libraries </H3><!--docid::SEC170::--><P>On modern Unices<A NAME="DOCF42" HREF="autobook_fot.html#FOOT42">(42)</A>, the shared library architectureis smart enough to encode all of the other libraries that a dynamicmodule depends on as part of the format of the file which is thatmodule. On these architectures, when you <CODE>lt_dlopen</CODE> a module, ifany shared libraries it depends on are not already loaded into the mainapplication, the system runtime loader will ensure that they too areloaded so that all of the module's symbols are satisfied.</P><P>Less well endowed systems<A NAME="DOCF43" HREF="autobook_fot.html#FOOT43">(43)</A>, cannot do this by themselves. Since Libtool release 1.4,libltdl uses the record of inter-library dependencies in thelibtool pseudo-library (see section <A HREF="autobook_68.html#SEC68">10. Introducing GNU Libtool</A>) to manuallyload dependent libraries as part of the <CODE>lt_dlopen</CODE> call.</P><P>An example of the sort of difficulties that can arise from trying toload a module that has a complex library dependency chain is typified by aproblem I encountered with GNU Guile a few years ago: Earlierreleases of the libXt Athena widget wrapper library for GNU Guilefailed to load on my a.out based GNU/Linux system. When I tried toload the module into a running Guile interpreter, it couldn't resolveany of the symbols that referred to libXt. I soon discovered that thelibraries that the module depended upon were not loaded by virtue ofloading the module itself. I needed to build the interpreter itselfwith libXt and rely on back-linking to resolve the <SAMP>`Xt'</SAMP> referenceswhen I loaded the module. This pretty much defeated the whole point ofhaving the wrapper library as a module. Had Libtool been around inthose days, it would have been able to load libXt as part of the processof loading the module.</P><P>If you program with the X window system, you will know that the list oflibraries you need to link into your applications soon grows to be verylarge. Worse, if you want to load an X extension module into a non-Xaware application, you will encounter the problems I found with Guile,unless you link your module with <CODE>libtool</CODE> and dynamically loadit with libltdl. At the moment, the various X Window librariesare not built with libtool, so you must be sure to list all of thedependencies when you link a module. By doing this, Libtool can use thelist to check that all of the libraries required by a module are loadedcorrectly as part of the call to <CODE>lt_dlopen</CODE>, like this:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>$ libtool --mode=link gcc -o module.so -module -avoid-version \source.c -L/usr/X11R6/lib -lXt -lX11...$ file .libs/module.so.libs/module.so: ELF 32-bit LSB shared object, Intel 80386,version 1, not stripped$ ldd .libs/module.so libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4012f00) libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x4014500)</pre></td></tr></table></P><P>Or, if you are using Automake:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>...lib_LTLIBRARIES = module.lamodule_la_SOURCES = source.cmodule_la_LDFLAGS = -module -avoid-version -L$(X11LIBDIR)module_la_LIBADD = -lXt -lX11...</pre></td></tr></table></P><P>It is especially important to be aware of this if you develop on amodern platform which correctly handles these dependencies natively (asin the example above), since the code may still work on your machineeven if you don't correctly note all of the dependencies. It will onlybreak if someone tries to use it on a machine that needs Libtool's helpfor it to work, thus reducing the portability of your project.</P><P><A NAME="libltdl Dynamic Module"></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 + -