﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Networking /C++/Linux-文章分类-DEBUG</title><link>http://www.cppblog.com/lk624424108/category/18372.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 24 Dec 2011 01:38:36 GMT</lastBuildDate><pubDate>Sat, 24 Dec 2011 01:38:36 GMT</pubDate><ttl>60</ttl><item><title>Makefile Libtool  Automake</title><link>http://www.cppblog.com/lk624424108/articles/162427.html</link><dc:creator>likun</dc:creator><author>likun</author><pubDate>Mon, 19 Dec 2011 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/lk624424108/articles/162427.html</guid><wfw:comment>http://www.cppblog.com/lk624424108/comments/162427.html</wfw:comment><comments>http://www.cppblog.com/lk624424108/articles/162427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lk624424108/comments/commentRss/162427.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lk624424108/services/trackbacks/162427.html</trackback:ping><description><![CDATA[<div><h2><a id="ctl01_TitleUrl" href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #223355; text-decoration: none; ">用automake建立共享库(动态链接库)Makefile</a></h2><div style="background-color: #ffffff; "><div id="cnblogs_post_body"><p style="font-family: Arial; line-height: 25px; ">要使用automake工具包建立一个交叉编译的共享库的Makefile</p><p style="font-family: Arial; line-height: 25px; ">这里用的autoconf是2.67版本，在debian下实现:</p><p style="font-family: Arial; line-height: 25px; ">如果版本低，可以用apt-get install automake来装最新的版本，还需要libtool,也需要用apt-get install来安装。</p><p style="font-family: Arial; line-height: 25px; ">这里建立一个简单的函数库来介绍：</p><p style="font-family: Arial; line-height: 25px; ">建立目录rx,及源码目录src:</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">$</span><span style="line-height: 1.5; color: #0000ff; ">mkdir</span><span style="line-height: 1.5; "> rx<br /></span><span style="line-height: 1.5; ">$</span><span style="line-height: 1.5; color: #0000ff; ">mkdir</span><span style="line-height: 1.5; "> rx</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">src</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">在rx/src下编辑rx.c,rx.h两个源文件:</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">mybdebian:</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">home</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">myb</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">php</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">rx</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">src</span><span style="line-height: 1.5; ">#</span><span style="line-height: 1.5; "> cat rx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">h<br /></span><span style="line-height: 1.5; ">#</span><span style="line-height: 1.5; ">ifndef __RX_H_<br /></span><span style="line-height: 1.5; ">#</span><span style="line-height: 1.5; ">define __RX_H_<br />int fun</span><span style="line-height: 1.5; ">();</span><span style="line-height: 1.5; "><br /></span><span style="line-height: 1.5; ">#</span><span style="line-height: 1.5; ">endif<br />mybdebian:</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">home</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">myb</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">php</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">rx</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">src</span><span style="line-height: 1.5; ">#</span><span style="line-height: 1.5; "> cat rx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">c<br /></span><span style="line-height: 1.5; ">#</span><span style="line-height: 1.5; ">include </span><span style="line-height: 1.5; ">"</span><span style="line-height: 1.5; ">rx.h</span><span style="line-height: 1.5; ">"</span><span style="line-height: 1.5; "><br />int fun</span><span style="line-height: 1.5; ">()</span><span style="line-height: 1.5; "><br />{<br />    </span><span style="line-height: 1.5; color: #0000ff; ">return</span> <span style="line-height: 1.5; ">1234</span><span style="line-height: 1.5; ">;</span><span style="line-height: 1.5; "><br />}</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">在rx目录和rx/src目录下分别建立Makefile.am文件</p><p style="font-family: Arial; line-height: 25px; ">rx目录下的Makefile.am为顶层Makefile.am文件，只要包含其存放源码的子目录即可，内容如下：</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">AUTOMAKE_OPTIONS</span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; ">foreign<br />SUBDIRS</span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; ">src</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">rx/src目录下的Makefile.am内容如下：</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">AUTOMAKE_OPTIONS</span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; ">foreign<br />lib_LTLIBRARIES</span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; ">librx.la<br />librx_la_SOURCES</span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; ">rx.c</span></div><div><span style="line-height: 1.5; ">include_HEADERS=rx.h</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">其中lib_LTLIBRARIES=后面的&#8220;librx.la&#8221;为要生成的库文件名,必须写成.la，不能是.so，实际会生成librx.so文件。</p><p style="font-family: Arial; line-height: 25px; ">下面的librx_la是librx.la把&#8220;.&#8221;换成下划线&#8220;_&#8221;后面加上&#8220;_SOURCES=&#8221;，等号以后为源文件名称，多于一个时用空格隔开。</p><p style="font-family: Arial; line-height: 25px; ">include_HEADERS=后面的为头文件，是供其它程序包含用的，make install时会复制到安装目录的include 目录中。</p><p style="font-family: Arial; line-height: 25px; ">回到上层目录，使用autoscan扫描源码目录:</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; color: #800080; ">$autoscan</span><span style="line-height: 1.5; "><br /></span><span style="line-height: 1.5; color: #800080; ">$ls</span><span style="line-height: 1.5; "><br />autoscan.log  configure.scan  Makefile.am  src</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">把configure.scan改名成为configure.ac</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; color: #800080; ">$mv</span><span style="line-height: 1.5; "> configure.scan configure.ac</span></div></pre></div><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">AC_OUTPUT([Makefile<br />                 src</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">Makefile])</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">编译这个文件:</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">$</span><span style="line-height: 1.5; ">vim configure</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">ac</span></div></pre></div><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; ">                                               -*- Autoconf -*-</span><span style="line-height: 1.5; color: #008000; "><br />#</span><span style="line-height: 1.5; color: #008000; "> Process this file with autoconf to produce a configure script.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br />AC_PREREQ([</span><span style="line-height: 1.5; ">2.67</span><span style="line-height: 1.5; ">])<br />AC_INIT([FULL</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">PACKAGE</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">NAME], [VERSION], [BUG</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">REPORT</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">ADDRESS])<br />AC_CONFIG_SRCDIR([src</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">rx.c])<br />AC_CONFIG_HEADERS([config.h])<br /><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for programs.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; ">AC_PROG_CC<br /><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for libraries.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for header files.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for typedefs, structures, and compiler characteristics.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for library functions.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br />AC_CONFIG_FILES([Makefile<br />                 src</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">Makefile])<br />AC_OUTPUT</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">修改AC_INIT一句，即把包的全名、版本号及BUG报告email地址添上，如：</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">AC_INIT(rx2dlib,</span><span style="line-height: 1.5; ">0.01</span><span style="line-height: 1.5; ">,resound</span><span style="line-height: 1.5; ">@</span><span style="line-height: 1.5; ">163</span><span style="line-height: 1.5; ">.com)</span></div></pre></div><p style="font-family: Arial; line-height: 25px; ">在它后面加一句:</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">AM_INIT_AUTOMAKE</span></div></pre></div><p style="font-family: Arial; line-height: 25px; ">这句话是必须的。</p><p style="font-family: Arial; line-height: 25px; ">由于这个脚本是用于生成共享库的，所以要加一句AC_PROG_LIBTOOL在AC_PROG_CC的下一行：</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for programs.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; ">AC_PROG_CC<br />AC_PROG_LIBTOOL</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">修改后面的那个AC_CONFIG_FILES语句，改成AC_OUTPUT,并把后面的一条AC_OUTPUT去掉：</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">AC_OUTPUT([Makefile<br />                 src</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">Makefile])</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">这样，configure.ac就建好了，修改后的内容如下:</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; ">                                               -*- Autoconf -*-</span><span style="line-height: 1.5; color: #008000; "><br />#</span><span style="line-height: 1.5; color: #008000; "> Process this file with autoconf to produce a configure script.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br />AC_PREREQ([</span><span style="line-height: 1.5; ">2.67</span><span style="line-height: 1.5; ">])<br />AC_INIT(rx2dlib,</span><span style="line-height: 1.5; ">0.01</span><span style="line-height: 1.5; ">,resound</span><span style="line-height: 1.5; ">@</span><span style="line-height: 1.5; ">163</span><span style="line-height: 1.5; ">.com)<br />AM_INIT_AUTOMAKE<br /><br />AC_CONFIG_SRCDIR([src</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">rx.c])<br />AC_CONFIG_HEADERS([config.h])<br /><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for programs.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; ">AC_PROG_CC<br />AC_PROG_LIBTOOL<br /><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for libraries.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for header files.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for typedefs, structures, and compiler characteristics.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br /></span><span style="line-height: 1.5; color: #008000; ">#</span><span style="line-height: 1.5; color: #008000; "> Checks for library functions.</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; "><br />AC_OUTPUT([Makefile<br />                 src</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">Makefile])</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">然后按顺序执行:</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">$</span><span style="line-height: 1.5; ">aclocal<br /></span><span style="line-height: 1.5; ">$</span><span style="line-height: 1.5; ">autoconf<br /></span><span style="line-height: 1.5; ">$</span><span style="line-height: 1.5; ">autoheader<br /></span><span style="line-height: 1.5; ">$</span><span style="line-height: 1.5; ">libtoolize --automake<br /></span><span style="line-height: 1.5; ">$</span><span style="line-height: 1.5; ">automake &#8211;-add-missing<br />configure</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">ac:</span><span style="line-height: 1.5; ">13</span><span style="line-height: 1.5; ">: installing `</span><span style="line-height: 1.5; ">./</span><span style="line-height: 1.5; ">config</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">guess'<br />configure</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">ac:</span><span style="line-height: 1.5; ">13</span><span style="line-height: 1.5; ">: installing `</span><span style="line-height: 1.5; ">./</span><span style="line-height: 1.5; ">config</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">sub'<br />configure</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">ac:</span><span style="line-height: 1.5; ">6</span><span style="line-height: 1.5; ">: installing `</span><span style="line-height: 1.5; ">./</span><span style="line-height: 1.5; ">install-sh'<br />configure</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">ac:</span><span style="line-height: 1.5; ">6</span><span style="line-height: 1.5; ">: installing `</span><span style="line-height: 1.5; ">./</span><span style="line-height: 1.5; ">missing'<br />src</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">Makefile</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">am: installing `</span><span style="line-height: 1.5; ">./</span><span style="line-height: 1.5; ">depcomp'</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">这时configure脚本已经生成了。</p><p style="font-family: Arial; line-height: 25px; ">可以用它来配置生成Makefile了。</p><p style="font-family: Arial; line-height: 25px; ">如我们要生成交叉编译给ARM CPU使用的共享库,这里假设我们要使用的编译器为arm-none-linux-gnueabi-gcc，并且我们最终在ARM板上执行时，要把库安装到目标板的/usr/local/armrx2d目录中去。可以这样配置:</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">$./</span><span style="line-height: 1.5; ">configure  --host</span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; ">arm-none-linux-gnueabi --prefix</span><span style="line-height: 1.5; ">=/</span><span style="line-height: 1.5; ">usr</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">local</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">armrx2d</span></div><div><span style="line-height: 1.5; "><p>$make</p></span></div><div><span face="'Courier New'" style="line-height: 1.5; "><br /></span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">Make完成后可以到src目录下面的一个隐藏目录.libs目录中看到生成的库文件：</p><div style="font-family: Arial; line-height: 25px; font-size: 12px; "><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; margin-left: 22px; font-family: 'Courier New'; "><div><span style="line-height: 1.5; ">mybdebian:</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">home</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">myb</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">php</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">rx</span><span style="line-height: 1.5; ">/</span><span style="line-height: 1.5; ">src</span><span style="line-height: 1.5; ">/.</span><span style="line-height: 1.5; ">libs</span><span style="line-height: 1.5; ">#</span><span style="line-height: 1.5; "> ls -l<br />总计 </span><span style="line-height: 1.5; ">20</span><span style="line-height: 1.5; "><br />-rw-r--r-- </span><span style="line-height: 1.5; ">1</span><span style="line-height: 1.5; "> root root </span><span style="line-height: 1.5; ">2368</span> <span style="line-height: 1.5; ">04</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">19</span> <span style="line-height: 1.5; ">22</span><span style="line-height: 1.5; ">:</span><span style="line-height: 1.5; ">48</span><span style="line-height: 1.5; "> librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">a<br />lrwxrwxrwx </span><span style="line-height: 1.5; ">1</span><span style="line-height: 1.5; "> root root   </span><span style="line-height: 1.5; ">11</span> <span style="line-height: 1.5; ">04</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">19</span> <span style="line-height: 1.5; ">22</span><span style="line-height: 1.5; ">:</span><span style="line-height: 1.5; ">48</span><span style="line-height: 1.5; "> librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">la -</span><span style="line-height: 1.5; ">&gt;</span> <span style="line-height: 1.5; ">../</span><span style="line-height: 1.5; ">librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">la<br />-rw-r--r-- </span><span style="line-height: 1.5; ">1</span><span style="line-height: 1.5; "> root root  </span><span style="line-height: 1.5; ">930</span> <span style="line-height: 1.5; ">04</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">19</span> <span style="line-height: 1.5; ">22</span><span style="line-height: 1.5; ">:</span><span style="line-height: 1.5; ">48</span><span style="line-height: 1.5; "> librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">lai<br />lrwxrwxrwx </span><span style="line-height: 1.5; ">1</span><span style="line-height: 1.5; "> root root   </span><span style="line-height: 1.5; ">14</span> <span style="line-height: 1.5; ">04</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">19</span> <span style="line-height: 1.5; ">22</span><span style="line-height: 1.5; ">:</span><span style="line-height: 1.5; ">48</span><span style="line-height: 1.5; "> librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">so -</span><span style="line-height: 1.5; ">&gt;</span><span style="line-height: 1.5; "> librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">so</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">0.0</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">0</span><span style="line-height: 1.5; "><br />lrwxrwxrwx </span><span style="line-height: 1.5; ">1</span><span style="line-height: 1.5; "> root root   </span><span style="line-height: 1.5; ">14</span> <span style="line-height: 1.5; ">04</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">19</span> <span style="line-height: 1.5; ">22</span><span style="line-height: 1.5; ">:</span><span style="line-height: 1.5; ">48</span><span style="line-height: 1.5; "> librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">so</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">0</span><span style="line-height: 1.5; "> -</span><span style="line-height: 1.5; ">&gt;</span><span style="line-height: 1.5; "> librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">so</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">0.0</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">0</span><span style="line-height: 1.5; "><br />-rwxr-xr-x </span><span style="line-height: 1.5; ">1</span><span style="line-height: 1.5; "> root root </span><span style="line-height: 1.5; ">5422</span> <span style="line-height: 1.5; ">04</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">19</span> <span style="line-height: 1.5; ">22</span><span style="line-height: 1.5; ">:</span><span style="line-height: 1.5; ">48</span><span style="line-height: 1.5; "> librx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">so</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">0.0</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">0</span><span style="line-height: 1.5; "><br />-rw-r--r-- </span><span style="line-height: 1.5; ">1</span><span style="line-height: 1.5; "> root root </span><span style="line-height: 1.5; ">2228</span> <span style="line-height: 1.5; ">04</span><span style="line-height: 1.5; ">-</span><span style="line-height: 1.5; ">19</span> <span style="line-height: 1.5; ">22</span><span style="line-height: 1.5; ">:</span><span style="line-height: 1.5; ">48</span><span style="line-height: 1.5; "> rx</span><span style="line-height: 1.5; ">.</span><span style="line-height: 1.5; ">o</span></div></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html" style="color: #1d58d1; text-decoration: none; ">复制代码</a></span></div></div><p style="font-family: Arial; line-height: 25px; ">我们再回到顶层目录，执行make install可以自动安装生成的库到/usr/local/armrx2d/lib目录下。</p><p style="font-family: Arial; line-height: 25px; ">若使用automake时出现下面错误信息</p><p style="font-family: Arial; line-height: 25px; ">required file `./ltmain.sh' not found</p><p style="font-family: Arial; line-height: 25px; ">是因为libtool未配置：</p><p style="font-family: Arial; line-height: 25px; ">解决办法：</p><p style="font-family: Arial; line-height: 25px; ">$libtoolize --automake --debug --copy &#8211;force</p><p style="font-family: Arial; line-height: 25px; ">或：</p><p><font face="Arial"><span style="line-height: 25px;">$libtoolize --automake</span></font><br /><br /></p><div><div><span style="line-height: 25px;">#</span></div><div><span style="line-height: 25px;">#</span></div><div><span style="line-height: 25px;"># 利用libtool自动生成动态库</span></div><div><span style="line-height: 25px;">#</span></div><div><span style="line-height: 25px;">1. autoscan命令在当前目录生成configure.scan文件, 内容为:</span></div><div><span style="line-height: 25px;"># -*- Autoconf -*-</span></div><div><span style="line-height: 25px;"># Process this file with autoconf to produce a configure script.</span></div><div><span style="line-height: 25px;">AC_PREREQ(2.57)</span></div><div><span style="line-height: 25px;">AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)</span></div><div><span style="line-height: 25px;">AC_CONFIG_SRCDIR([src/bot.h])</span></div><div><span style="line-height: 25px;">AC_CONFIG_HEADER([config.h])</span></div><div><span style="line-height: 25px;"># Checks for programs.</span></div><div><span style="line-height: 25px;">AC_PROG_CXX</span></div><div><span style="line-height: 25px;">AC_PROG_CC</span></div><div><span style="line-height: 25px;"># Checks for libraries.</span></div><div><span style="line-height: 25px;"># Checks for header files.</span></div><div><span style="line-height: 25px;">AC_HEADER_STDC</span></div><div><span style="line-height: 25px;">AC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])</span></div><div><span style="line-height: 25px;"># Checks for typedefs, structures, and compiler characteristics.</span></div><div><span style="line-height: 25px;">AC_HEADER_STDBOOL</span></div><div><span style="line-height: 25px;">AC_C_CONST</span></div><div><span style="line-height: 25px;">AC_C_INLINE</span></div><div><span style="line-height: 25px;"># Checks for library functions.</span></div><div><span style="line-height: 25px;">AC_FUNC_MALLOC</span></div><div><span style="line-height: 25px;">AC_FUNC_REALLOC</span></div><div><span style="line-height: 25px;">AC_CHECK_FUNCS([memset strcasecmp strchr strdup])</span></div><div><span style="line-height: 25px;">AC_OUTPUT</span></div><div><span style="line-height: 25px;">将其该名为configure.ac 然后修改:</span></div><div><span style="line-height: 25px;">configure.ac 文件是 autoconf 的输入文件，经过 autoconf 处理，展开里面的 m4宏，</span></div><div><span style="line-height: 25px;">输出的是 configure 脚本。</span></div><div><span style="line-height: 25px;">第 4 行声明本文件要求的 autoconf 版本，因为本例使用了新版本 2.57，所以在此注明。</span></div><div><span style="line-height: 25px;">第 5 行 AC_INIT 宏用来定义软件的名称和版本等信息</span></div><div><span style="line-height: 25px;">AC_INIT([test], 1.0, [email]linhanzu@gmail.com[/email])</span></div><div><span style="line-height: 25px;">增加版本信息(为生成lib库做准备)</span></div><div><span style="line-height: 25px;">lt_major=1</span></div><div><span style="line-height: 25px;">lt_age=1</span></div><div><span style="line-height: 25px;">lt_revision=12</span></div><div><span style="line-height: 25px;">dist_version=0.1.12</span></div><div><span style="line-height: 25px;">AM_INIT_AUTOMAKE(test, $dist_version) //自动生成Makefile文件</span></div><div><span style="line-height: 25px;">增加宏, 打开共享库</span></div><div><span style="line-height: 25px;">AC_PROG_LIBTOOL</span></div><div><span style="line-height: 25px;"># Check for dl &nbsp;</span></div><div><span style="line-height: 25px;">DL_PRESENT=""</span></div><div><span style="line-height: 25px;">AC_CHECK_LIB( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )</span></div><div><span style="line-height: 25px;">if test "x$DL_PRESENT" = "xyes"; then</span></div><div><span style="line-height: 25px;">AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])</span></div><div><span style="line-height: 25px;">DL_LIBS="-ldl"</span></div><div><span style="line-height: 25px;">AC_SUBST(DL_LIBS)</span></div><div><span style="line-height: 25px;">fi</span></div><div><span style="line-height: 25px;"># Check for libm</span></div><div><span style="line-height: 25px;">M_PRESENT=""</span></div><div><span style="line-height: 25px;">AC_CHECK_LIB( m, sin, M_PRESENT="yes",, $M_LIBS -lm )</span></div><div><span style="line-height: 25px;">if test "x$M_PRESENT" = "xyes"; then</span></div><div><span style="line-height: 25px;">AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])</span></div><div><span style="line-height: 25px;">M_LIBS="-lm"</span></div><div><span style="line-height: 25px;">AC_SUBST(M_LIBS)</span></div><div><span style="line-height: 25px;">fi</span></div><div><span style="line-height: 25px;">增加依赖库，这里就仅仅列举了pthread库，生成的Makefile会自动加上-pthread</span></div><div><span style="line-height: 25px;"># Check for pthread</span></div><div><span style="line-height: 25px;">PTHREAD_PRESENT=""</span></div><div><span style="line-height: 25px;">AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",, $PTHREAD_LIBS</span></div><div><span style="line-height: 25px;">-lpthread )</span></div><div><span style="line-height: 25px;">if test "x$PTHREAD_PRESENT" = "xyes"; then</span></div><div><span style="line-height: 25px;">AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])</span></div><div><span style="line-height: 25px;">PTHREAD_LIBS="-lpthread"</span></div><div><span style="line-height: 25px;">AC_SUBST(PTHREAD_LIBS)</span></div><div><span style="line-height: 25px;">fi</span></div><div><span style="line-height: 25px;">要生成项目工程目录和其它目录下的Makefile 文件, 必需加入</span></div><div><span style="line-height: 25px;">AM_CONFIG_FILES的宏:</span></div><div><span style="line-height: 25px;">例如: AC_CONFIG_FILES([Makefile</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;src/Makefile</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data/Makefile</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;docs/Makefile])</span></div><div><span style="line-height: 25px;">修改完后Makefile.ac如下:</span></div><div><span style="line-height: 25px;"># -*- Autoconf -*-</span></div><div><span style="line-height: 25px;"># Process this file with autoconf to produce a configure script.</span></div><div><span style="line-height: 25px;">AC_PREREQ(2.57)</span></div><div><span style="line-height: 25px;">AC_INIT([test],[1.0],[[email]arne_caspari@users.sourceforge.net[/email]])</span></div><div><span style="line-height: 25px;">AM_CONFIG_HEADER(config.h)</span></div><div><span style="line-height: 25px;">lt_major=1</span></div><div><span style="line-height: 25px;">lt_age=1</span></div><div><span style="line-height: 25px;">lt_revision=12</span></div><div><span style="line-height: 25px;">dist_version=0.1.12</span></div><div><span style="line-height: 25px;">AM_INIT_AUTOMAKE(test, $dist_version)</span></div><div><span style="line-height: 25px;">AC_SUBST(lt_major)</span></div><div><span style="line-height: 25px;">AC_SUBST(lt_revision)</span></div><div><span style="line-height: 25px;">AC_SUBST(lt_age)</span></div><div><span style="line-height: 25px;"># Checks for programs.</span></div><div><span style="line-height: 25px;">#AC_PROG_CC</span></div><div><span style="line-height: 25px;">#AC_PROG_INSTALL</span></div><div><span style="line-height: 25px;">#AC_PROG_LN_S</span></div><div><span style="line-height: 25px;">#AC_PROG_LIBTOOL</span></div><div><span style="line-height: 25px;">AM_PROG_LIBTOOL</span></div><div><span style="line-height: 25px;"># Checks for libraries.</span></div><div><span style="line-height: 25px;">pkg_modules="gtk+-2.0 &gt;= 2.0.0"</span></div><div><span style="line-height: 25px;">PKG_CHECK_MODULES(GTK_PACKAGE, [$pkg_modules], HAVE_GTK2="yes", HAVE_GTK2="no" )</span></div><div><span style="line-height: 25px;">AC_SUBST(GTK_PACKAGE_CFLAGS)</span></div><div><span style="line-height: 25px;">AC_SUBST(GTK_PACKAGE_LIBS)</span></div><div><span style="line-height: 25px;"># Check for dl</span></div><div><span style="line-height: 25px;">DL_PRESENT=""</span></div><div><span style="line-height: 25px;">AC_CHECK_LIB( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )</span></div><div><span style="line-height: 25px;">if test "x$DL_PRESENT" = "xyes"; then</span></div><div><span style="line-height: 25px;">AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])</span></div><div><span style="line-height: 25px;">DL_LIBS="-ldl"</span></div><div><span style="line-height: 25px;">AC_SUBST(DL_LIBS)</span></div><div><span style="line-height: 25px;">fi</span></div><div><span style="line-height: 25px;"># Check for libm</span></div><div><span style="line-height: 25px;">M_PRESENT=""</span></div><div><span style="line-height: 25px;">AC_CHECK_LIB( m, sin, M_PRESENT="yes",, $M_LIBS -lm )</span></div><div><span style="line-height: 25px;">if test "x$M_PRESENT" = "xyes"; then</span></div><div><span style="line-height: 25px;">AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])</span></div><div><span style="line-height: 25px;">M_LIBS="-lm"</span></div><div><span style="line-height: 25px;">AC_SUBST(M_LIBS)</span></div><div><span style="line-height: 25px;">fi</span></div><div><span style="line-height: 25px;"># Check for pthread&nbsp;</span></div><div><span style="line-height: 25px;">PTHREAD_PRESENT=""</span></div><div><span style="line-height: 25px;">AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",, $PTHREAD_LIBS</span></div><div><span style="line-height: 25px;">-lpthread )</span></div><div><span style="line-height: 25px;">if test "x$PTHREAD_PRESENT" = "xyes"; then</span></div><div><span style="line-height: 25px;">AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])</span></div><div><span style="line-height: 25px;">PTHREAD_LIBS="-lpthread"</span></div><div><span style="line-height: 25px;">AC_SUBST(PTHREAD_LIBS)</span></div><div><span style="line-height: 25px;">fi</span></div><div><span style="line-height: 25px;"># Checks for header files.</span></div><div><span style="line-height: 25px;">#AC_HEADER_DIRENT</span></div><div><span style="line-height: 25px;">#AC_HEADER_STDC</span></div><div><span style="line-height: 25px;">#AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h])</span></div><div><span style="line-height: 25px;"># Checks for typedefs, structures, and compiler characteristics.</span></div><div><span style="line-height: 25px;">#AC_TYPE_PID_T</span></div><div><span style="line-height: 25px;">#AC_TYPE_SIZE_T</span></div><div><span style="line-height: 25px;">#AC_HEADER_TIME</span></div><div><span style="line-height: 25px;"># Checks for library functions.</span></div><div><span style="line-height: 25px;">#AC_FUNC_CLOSEDIR_VOID</span></div><div><span style="line-height: 25px;">#AC_FUNC_MALLOC</span></div><div><span style="line-height: 25px;">#AC_CHECK_FUNCS([memset strstr])</span></div><div><span style="line-height: 25px;">AC_CONFIG_FILES([Makefile</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;src/Makefile</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data/Makefile</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;doc/Makefile])</span></div><div><span style="line-height: 25px;">AC_OUTPUT</span></div><div><span style="line-height: 25px;"><br /></span></div><div><span style="line-height: 25px;">2.生成各目录下的Makefile.am文件</span></div><div><span style="line-height: 25px;">./Makefile.am &nbsp; //工程目录下</span></div><div><span style="line-height: 25px;">&nbsp; SUBDIR = src data doc</span></div><div><span style="line-height: 25px;">../src/Makefile.am &nbsp;//源码目录下</span></div><div><span style="line-height: 25px;">&nbsp; MAINTAINERCLEANFILES = Makefile.in</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp;INCLUDES = -I../include &nbsp;</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp;CPPFLAGS=-DINSTALL_PREFIX="\"$(prefix)\""</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp;lib_LTLIBRARIES = libtest.la</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp;libtest_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp;libtest_la_SOURCES = \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test.c \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test_private.h \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check_match.c \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check_match.h \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test_helpers.c \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test_helpers.h \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; debug.h</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; libtest_la_LIBADD = \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @DL_LIBS@ \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @M_LIBS@</span></div><div><span style="line-height: 25px;"><br /></span></div><div><span style="line-height: 25px;">3. 生成autogen.sh脚本, 内容</span></div><div><span style="line-height: 25px;">#! /bin/sh</span></div><div><span style="line-height: 25px;">set -x</span></div><div><span style="line-height: 25px;">aclocal</span></div><div><span style="line-height: 25px;">autoheader</span></div><div><span style="line-height: 25px;">automake --foreign --add-missing --copy</span></div><div><span style="line-height: 25px;">autoconf</span></div><div><span style="line-height: 25px;"><br /></span></div><div><span style="line-height: 25px;">保存后修改权限 chmod a+x autogen.sh</span></div><div><span style="line-height: 25px;"><br /></span></div><div><span style="line-height: 25px;">3.运行脚本./autogen.sh, 生成configure脚本. 这里可能会遇到错误, 可以根据错误提示作相应修改.（注意：如果您修改了Makefile.am中的项，那么就得重新执行这一步）</span></div><div><span style="line-height: 25px;"><br /></span></div><div><span style="line-height: 25px;">4.运行./configure脚本.自动生成src目录下的makefile文件</span></div><div><span style="line-height: 25px;"><br /></span></div><div><span style="line-height: 25px;">5. 切换到目录src, 运行make 自动在当前目录下建立.libs文件, 编程生成的库文件就保存在该目录下.</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; make install 安装在默认目录 /usr/local/lib/下.</span></div><div><span style="line-height: 25px;"><br /></span></div><div><span style="line-height: 25px;">6.如果要生成其它的安装目录，Makefile.am就要这样写</span></div><div><span style="line-height: 25px;">MAINTAINERCLEANFILES = Makefile.in</span></div><div><span style="line-height: 25px;">INCLUDES = -I../include&nbsp;</span></div><div><span style="line-height: 25px;">lib_LTLIBRARIES = libtt.la</span></div><div><span style="line-height: 25px;">libdir = $(prefix)/lib/test &nbsp;//这个就是安装目录</span></div><div><span style="line-height: 25px;">libtt_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@</span></div><div><span style="line-height: 25px;">libtt_la_LIBADD = @PTHREAD_LIBS@</span></div><div><span style="line-height: 25px;">libtt_la_SOURCES = \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tt.c \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; video.c \</span></div><div><span style="line-height: 25px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; video.h</span></div><div><span style="line-height: 25px;"><br /></span></div><div><span style="line-height: 25px;">当然，Makefile中的语法规则中还有很多宏定义，您可以在Makefile的官方网站找到说明。</span></div><div><span style="line-height: 25px;">下一篇就打算写写条件编译的Makefile写法。</span></div></div><br /><div><a href="http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html">http://www.cnblogs.com/resound/archive/2011/04/19/2021681.html</a></div><div><a href="http://bbs.chinaunix.net/thread-2165630-1-1.html">http://bbs.chinaunix.net/thread-2165630-1-1.html</a></div><br /><br /><br /><br /><br /><br /><p>&nbsp;</p></div></div></div><img src ="http://www.cppblog.com/lk624424108/aggbug/162427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lk624424108/" target="_blank">likun</a> 2011-12-19 22:47 <a href="http://www.cppblog.com/lk624424108/articles/162427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用gdb调试动态链接库</title><link>http://www.cppblog.com/lk624424108/articles/162157.html</link><dc:creator>likun</dc:creator><author>likun</author><pubDate>Thu, 15 Dec 2011 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/lk624424108/articles/162157.html</guid><wfw:comment>http://www.cppblog.com/lk624424108/comments/162157.html</wfw:comment><comments>http://www.cppblog.com/lk624424108/articles/162157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lk624424108/comments/commentRss/162157.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lk624424108/services/trackbacks/162157.html</trackback:ping><description><![CDATA[<div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; "><strong>用gdb调试动态链接库</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;大家都知道在 Linux 可以用 gdb 来调试应用程序，当然前提是用 gcc 编译程序时要加上 -g 参数。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;首先，假设我们准备这样的一个动态链接库：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;引用：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;<strong>库名称是： ggg</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; "><strong>&nbsp;&nbsp;&nbsp;&nbsp;动态链接库文件名是： libggg.so</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; "><strong>&nbsp;&nbsp;&nbsp;&nbsp;头文件是： get.h</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; "><strong>&nbsp;&nbsp;&nbsp;&nbsp;提供这样两个函数调用接口：</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; "><strong>&nbsp;&nbsp;&nbsp;&nbsp; int get ();</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; "><strong>&nbsp;&nbsp;&nbsp;&nbsp; int set (int a);</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; "><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;要生成这样一个动态链接库，我们首先编写这样一个头文件：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;/************关于本文档********************************************</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;*filename: get.h</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;*********************************************************************/</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;int get ();</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;int set (int a);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;然后准备这样一个生成动态链接库的源文件：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;/************关于本文档********************************************</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;*filename: get.cpp</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;*********************************************************************/</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;#include</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;#include "get.h"</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;static int x=0;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;int get ()</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;{</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; printf ("get x=%d\n", x);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; return x;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;int set (int a)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;{</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; printf ("set a=%d\n", a);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; x = a;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; return x;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;然后我们用 GNU 的 C/C++ 编译器来生成动态链接库，编译命令如下：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;引用：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;g++ get.cpp -shared -g -DDEBUG -o libggg.so</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;这样我们就准备好了动态链接库了，下面我们编写一个应用程序来调用此动态链接库，源代码如下：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;/************关于本文档********************************************</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;*filename: pk.cpp</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;*********************************************************************/</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;#include</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;#include "get.h"</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;int main (int argc, char** argv)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;{</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; int a = 100;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; int b = get ();</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; int c = set (a);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; int d = get ();</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp; return 0;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;编译此程序用下列命令，如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录，比如 /lib 或 /usr/lib 之类的，就用下面这条命令：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;引用：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;g++ pk.cpp -o app -Wall -g -lggg</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;否则就用下面这条命令：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;引用：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;g++ pk.cpp -o app -Wall -g -lggg -L`pwd`</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;下面我们就开始调试上面命令生成的 app 程序吧。如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录，比如 /lib 或 /usr/lib 之类的，调试就顺利完成，如下：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;引用：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;#gdb ./app</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;GNU gdb 6.4-debian</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Copyright 2005 Free Software Foundation, Inc.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;GDB is free software, covered by the GNU General Public License, and you are</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;welcome to change it and/or distribute copies of it under certain conditions.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Type "show copying" to see the conditions.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;There is absolutely no warranty for GDB. Type "show warranty" for details.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) b main /* 这是在程序的 main 处设置断点 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Breakpoint 1 at 0x804853c: file pk.cpp, line 7.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) b set /* 这是在程序的 set 处设置断点 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Function "set" not defined.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Make breakpoint pending on future shared library load? (y or [n]) y /* 这里必须选择 y 调试程序才会跟踪到动态链接库内部去 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Breakpoint 2 (set) pending.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) run /* 开始运行我们的程序，直到遇见断点时暂停 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Starting program: /data/example/c/app</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Breakpoint 3 at 0xb7f665f8: file get.cpp, line 11.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Pending breakpoint "set" resolved</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Breakpoint 1, main (argc=1, argv=0xbf990504) at pk.cpp:7</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;7 int a = 100;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n /* 继续执行程序的下一行代码 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;8 int b = get ();</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n /* 程序执行到了我们断点所在的动态链接库了 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;get x=0</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;9 int c = set (a);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Breakpoint 3, set (a=100) at get.cpp:11</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;11 printf ("set a=%d\n", a);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) list /* 查看当前代码行周围的代码，证明我们已经跟踪到动态链接库的源代码里面了 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;6 printf ("get x=%d\n", x);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;7 return x;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;8 }</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;9 int set (int a)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;10 {</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;11 printf ("set a=%d\n", a);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;12 x = a;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;13 return x;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;14 }</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;set a=100</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;12 x = a;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;13 return x;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;14 }</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;main (argc=1, argv=0xbf990504) at pk.cpp:10</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;10 int d = get ();</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;get x=100</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;11 printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) n</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;a=100,b=0,c=100,d=100</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;12 return 0;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) c</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Continuing.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Program exited normally.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) quit /* 程序顺利执行结束 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;如果我们没有把动态链接库放到指定目录，比如/lib里面，调试就会失败，过程如下：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;引用：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;# gdb ./app</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;GNU gdb 6.4-debian</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Copyright 2005 Free Software Foundation, Inc.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;GDB is free software, covered by the GNU General Public License, and you are</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;welcome to change it and/or distribute copies of it under certain conditions.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Type "show copying" to see the conditions.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;There is absolutely no warranty for GDB. Type "show warranty" for details.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) b main</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Breakpoint 1 at 0x804853c: file pk.cpp, line 7.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) b set</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Function "set" not defined.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Make breakpoint pending on future shared library load? (y or [n]) y</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Breakpoint 2 (set) pending.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) run /* 虽然调试操作都一样，但程序执行失败 */</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Starting program: /data/example/c/app</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;/data/example/c/app: error while loading shared libraries: libggg.so: cannot open shared object file: No such file or directory</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;Program exited with code 0177.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 15px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 23px; color: #333333; font-family: 宋体, Arial; ">&nbsp;&nbsp;&nbsp;&nbsp;(gdb) quit<br /><a href="http://os.chinaunix.net/a2007/0830/976/000000976152.shtml">http://os.chinaunix.net/a2007/0830/976/000000976152.shtml</a></p></div><img src ="http://www.cppblog.com/lk624424108/aggbug/162157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lk624424108/" target="_blank">likun</a> 2011-12-15 10:56 <a href="http://www.cppblog.com/lk624424108/articles/162157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程debug</title><link>http://www.cppblog.com/lk624424108/articles/162152.html</link><dc:creator>likun</dc:creator><author>likun</author><pubDate>Thu, 15 Dec 2011 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/lk624424108/articles/162152.html</guid><wfw:comment>http://www.cppblog.com/lk624424108/comments/162152.html</wfw:comment><comments>http://www.cppblog.com/lk624424108/articles/162152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lk624424108/comments/commentRss/162152.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lk624424108/services/trackbacks/162152.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 七、八年前写过一篇《用GDB调试程序》，于是，从那以后，很多朋友在MSN上以及给我发邮件询问我关于GDB的问题，一直到今天，还有人在问GDB的相关问题。这么多年来，有一些问题是大家反复在问的，一方面，我觉得我以前的文章可能没有说清楚，另一方面，我觉得大家常问的问题正是最有用的，所以，在这里罗列出来。希望大家补充。一、多线程调试多线程调试可能是问得最多的。其实，重要就是下面几个命令：info thr...&nbsp;&nbsp;<a href='http://www.cppblog.com/lk624424108/articles/162152.html'>阅读全文</a><img src ="http://www.cppblog.com/lk624424108/aggbug/162152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lk624424108/" target="_blank">likun</a> 2011-12-15 10:44 <a href="http://www.cppblog.com/lk624424108/articles/162152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>