﻿<?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++博客-yg2362-随笔分类-Linux</title><link>http://www.cppblog.com/yg2362/category/18456.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 06 Sep 2012 19:54:47 GMT</lastBuildDate><pubDate>Thu, 06 Sep 2012 19:54:47 GMT</pubDate><ttl>60</ttl><item><title>共享内存(一)</title><link>http://www.cppblog.com/yg2362/archive/2012/09/06/189732.html</link><dc:creator>梨树阳光</dc:creator><author>梨树阳光</author><pubDate>Thu, 06 Sep 2012 11:26:00 GMT</pubDate><guid>http://www.cppblog.com/yg2362/archive/2012/09/06/189732.html</guid><wfw:comment>http://www.cppblog.com/yg2362/comments/189732.html</wfw:comment><comments>http://www.cppblog.com/yg2362/archive/2012/09/06/189732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yg2362/comments/commentRss/189732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yg2362/services/trackbacks/189732.html</trackback:ping><description><![CDATA[进程间通信方式包括了管道，消息队列，FIFO，共享内存，而共享内存是其中效率最高的。下图解释了其效率最高的原因(图片截取自《UNIX网络编程》)<br /><img src="http://www.cppblog.com/images/cppblog_com/yg2362/ipc.JPG" width="643" height="502" alt="" /><br />我们可以看到上面的拷贝次数是4次，下面则是2次。<br />接下来我们看看使用，其实网上和书上都有了很多资料，API就是那么几个。<br />int shmget(key_t key,size_t size,int shmflag)。<br />key：可以指定IPC_PRIVATE,那么系统会为你创建一个key，并且返回一个id号。也可以通过ftok函数生成一个key（不了解ftok的童鞋可以动手man一下）。那么为什么要一个IPC既要一个key又有一个ID呢。这里我觉得是为了方便其他进程访问。进程A创建了一个共享内存，内核为其分配一个ID，这个时候进程B想要访问，他怎么获取这个ID(难道需要A把ID发送给B？？)。但是我们用一个key就很方便了。事先A,B进程都知道这个key，那么A创建了，B就可以通过事先知道key找到这块内存。<br />size：共享内存的大小。如果是获得一块内存，则该值应该为0。<br />shmflag:读写权限的组合，可以与IPC_CREAT和IPC_EXCL按位或。当指定一个key时，IPC_CREAT和IPC_EXCL配合使用可以在存在该key的共享内存时返回-1。<br />当该函数调用成功后，返回一个系统分配的共享内存，并且size大小的字节被初始化为0<br /><br /><div>void *shmat(int shmid, const void *shmaddr, int shmflg)<br />有了一块共享内存后，进程需要映射该内存到进程的地址空间。这个函数就是作用。<br />shmid就是之前获得ID，shmaddr如果指定了，就会配合shmflg确定映射地址，不过一般都不这么干的。返回值就是获得的地址，你可以往里面写你或者读你需要的数据了。同时调用了该函数，系统会修改shmid_ds数据。<br /><br />int shmdt(const void *shmaddr)<br />解除绑定关系，参数就是我们之前获取的那个返回地址。(其实我觉得这里参数如果为ID貌似更统一些吧)<br /><br /><div>int shmctl(int shmid, int cmd, struct shmid_ds *buf)</div>这个函数主要做一些修改和查询。比如设置锁，解锁，移除一块共享内存。<br /><br />简单介绍了API，还要说一下一些注意的东西<br />1.共享内存不会把数据写入磁盘文件中，这个区别于mmap<br />2.即使没有进程绑定在共享内存，共享内存也不会消失的。必须通过shmctl或者ipcrm删除(或者更暴力的方式关掉电脑)<br /><br />另外我们可能会考虑，系统最多创建多少个共享内存，一个进程最多可以绑定多少个内存，一个共享内存创建的size最大最小值是多少。其实这些设置在/proc/sys/kernel下面，我们也可以自己写程序来读取。贴一段代码用来获取上面的信息<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span>&nbsp;MAX_SHMIDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8196<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;shmid[MAX_SHMIDS]&nbsp;=&nbsp;{0};<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*addr[MAX_SHMIDS]&nbsp;=&nbsp;{0};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">测试可以创建多少个共享内存</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;i&nbsp;=&nbsp;0;i&nbsp;&lt;&nbsp;MAX_SHMIDS;++i&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmid[i]&nbsp;=&nbsp;shmget(IPC_PRIVATE,1024,0666|IPC_CREAT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;shmid[i]&nbsp;==&nbsp;-1&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create&nbsp;shared&nbsp;memory&nbsp;failed,max&nbsp;create&nbsp;num[%d],%s\r\n",i,strerror(errno));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;j&nbsp;&lt;&nbsp;i;++j&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shmid[j],IPC_RMID,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">测试每个进程可以attach的最大数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;i&nbsp;=&nbsp;0;i&nbsp;&lt;&nbsp;MAX_SHMIDS;++i&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmid[i]&nbsp;=&nbsp;shmget(IPC_PRIVATE,1024,0666|IPC_CREAT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;shmid[i]&nbsp;!=&nbsp;-1&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[i]&nbsp;=&nbsp;shmat(shmid[i],0,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;addr[i]&nbsp;==&nbsp;(<span style="color: #0000FF; ">void</span>&nbsp;*)-1&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("process&nbsp;attach&nbsp;shared&nbsp;memory&nbsp;failed,max&nbsp;num[%d],%s\r\n",i,strerror(errno));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shmid[i],IPC_RMID,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("max&nbsp;num&nbsp;of&nbsp;process&nbsp;attach&nbsp;shared&nbsp;memory&nbsp;is[%d]\r\n",i-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;j&nbsp;=&nbsp;0;j&nbsp;&lt;&nbsp;i;++j&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmdt(addr[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shmid[j],IPC_RMID,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">测试一个共享内存创建最小的size</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;size&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;;;size++&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmid[0]&nbsp;=&nbsp;shmget(IPC_PRIVATE,size,0666|IPC_CREAT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;shmid[0]&nbsp;!=&nbsp;-1&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create&nbsp;shared&nbsp;memory&nbsp;succeed,min&nbsp;size[%d]\r\n",size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shmid[0],IPC_RMID,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">测试共享内存创建最大的size</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;size&nbsp;=&nbsp;65536;;size&nbsp;+=&nbsp;1024&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmid[0]&nbsp;=&nbsp;shmget(IPC_PRIVATE,size,0666|IPC_CREAT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;shmid[0]&nbsp;==&nbsp;-1&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create&nbsp;shared&nbsp;memory&nbsp;failed,max&nbsp;size[%ld],%s\r\n",size,strerror(errno));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shmid[0],IPC_RMID,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br />}</div>好了，下篇开始介绍如何控制读写。</div><img src ="http://www.cppblog.com/yg2362/aggbug/189732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yg2362/" target="_blank">梨树阳光</a> 2012-09-06 19:26 <a href="http://www.cppblog.com/yg2362/archive/2012/09/06/189732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下的静态库和动态库</title><link>http://www.cppblog.com/yg2362/archive/2012/07/11/182832.html</link><dc:creator>梨树阳光</dc:creator><author>梨树阳光</author><pubDate>Wed, 11 Jul 2012 07:15:00 GMT</pubDate><guid>http://www.cppblog.com/yg2362/archive/2012/07/11/182832.html</guid><wfw:comment>http://www.cppblog.com/yg2362/comments/182832.html</wfw:comment><comments>http://www.cppblog.com/yg2362/archive/2012/07/11/182832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yg2362/comments/commentRss/182832.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yg2362/services/trackbacks/182832.html</trackback:ping><description><![CDATA[<div><p style="margin:0in;font-size:16.0pt"><span style="font-family:Calibri">1.</span><span style="font-family:SimSun">制作自己的动态库和静态库</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">linux</span><span style="font-family:SimSun">下动态库以</span><span style="font-family:Calibri">.so</span><span style="font-family:SimSun">结尾，静态库以</span><span style="font-family:Calibri">.a</span><span style="font-family:SimSun">结尾，它们都以</span><span style="font-family: Calibri">lib</span><span style="font-family:SimSun">开头，比如一个库名为</span><span style="font-family:Calibri">net,</span><span style="font-family: SimSun">那么它的全名应该是</span><span style="font-family:Calibri">libnet.so</span><span style="font-family:SimSun">或者</span><span style="font-family:Calibri">libnet.a</span><span style="font-family: SimSun">。</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:SimSun">我们有两个文件，</span><span style="font-family:Calibri">hello.c</span><span style="font-family:SimSun">和</span><span style="font-family:Calibri">test.c</span><span style="font-family:SimSun">，下面是两个文件的内容</span></p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">//hello.c</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">#include &lt;stdio.h&gt;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">&nbsp;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">void my_lib_func()</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">{</p>  <p style="margin:0in;margin-left:.375in;font-family:SimSun;font-size:10.0pt">printf("Library routine called\r\n");</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">}</p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">&nbsp;</p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">//test.c</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">#include &lt;stdio.h&gt;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">&nbsp;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">int main()</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">{</p>  <p style="margin:0in;margin-left:.375in;font-family:SimSun;font-size:10.0pt">my_lib_func();</p>  <p style="margin:0in;margin-left:.375in;font-family:SimSun;font-size:10.0pt">&nbsp;</p>  <p style="margin:0in;margin-left:.375in;font-family:SimSun;font-size:10.0pt">return 1;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">}</p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">&nbsp;</p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">test.c</span><span style="font-family:宋体">调用了</span><span style="font-family:Calibri">hello.c</span><span style="font-family: 宋体">的方法，我们把</span><span style="font-family:Calibri">hello.c</span><span style="font-family:宋体">封装成库文件。无论是静态库还是动态库，都是由</span><span style="font-family:Calibri">.o</span><span style="font-family:宋体">文件组成，我们先把</span><span style="font-family:Calibri">gcc -c hello.c</span><span style="font-family:宋体">生成</span><span style="font-family:Calibri">.o</span><span style="font-family:宋体">文件</span></p>  <p style="margin:0in;font-family:宋体;font-size:11.0pt">制作静态库</p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:SimSun">ar crv libmyhello.a hello.o，</span><span style="font-family:Calibri">ar</span><span style="font-family:SimSun">是生成静态库的命令，libmyhello.a是我的静态库名。下一步就是在我的程序中使用静态库</span></p>  <p style="margin:0in"><div><img src="http://www.cppblog.com/images/cppblog_com/yg2362/1.png" width="721" height="78" alt="" /></div></p>  <p style="margin:0in;font-family:SimSun;font-size:11.0pt">可以看到已经有了Library routine called的结果，说明调用成功了。</p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:SimSun">下面我们删除</span><span style="font-family:Calibri">libmyhello.a,</span><span style="font-family:SimSun">看看程序是否还是运行正常</span></p>  <p style="margin:0in"><img src="http://www.cppblog.com/images/cppblog_com/yg2362/2.png" width="367" height="65" alt="" /><br /></p>  <p style="margin:0in;font-family:SimSun;font-size:11.0pt">我们发现程序依然运行正常，说明静态库已经连接进入我们的程序中</p>  <p style="margin:0in;font-family:SimSun;font-size:11.0pt">制作动态库</p>  <p style="margin:0in"><img src="http://www.cppblog.com/images/cppblog_com/yg2362/3.png" width="574" height="108" alt="" /><br /></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:SimSun">我们看见动态库</span><span style="font-family:Calibri">libmyhello.so</span><span style="font-family:SimSun">已经生成，下面继续使用</span></p>  <p style="margin:0in"><img src="http://www.cppblog.com/images/cppblog_com/yg2362/4.png" width="957" height="50" alt="" /><br /></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:SimSun">找不到库文件，这个时候我们把</span><span style="font-family:Calibri">so</span><span style="font-family:SimSun">文件拷贝到</span><span style="font-family: Calibri">/usr/lib</span><span style="font-family:SimSun">下面</span></p>  <p style="margin:0in"><img src="http://www.cppblog.com/images/cppblog_com/yg2362/5.png" width="435" height="45" alt="" /><br /></p>  <p style="margin:0in;font-family:SimSun;font-size:11.0pt">运行成功</p>  <p style="margin:0in;font-family:SimSun;font-size:11.0pt">&nbsp;</p>  <p style="margin:0in;font-size:16.0pt"><span style="font-family:Calibri">2.</span><span style="font-family:SimSun">动态库和静态库同时存在的调用规则</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:SimSun">我们可以发现，不论是动态库还是静态库，程序编译连接的时候都是加的参数</span><span style="font-family: Calibri">-l</span><span style="font-family:SimSun">，那么当他们同时存在的时候，程序会选择动态库还是静态库呢。我们做个尝试。</span></p>  <p style="margin:0in"><img src="http://www.cppblog.com/images/cppblog_com/yg2362/6.png" width="952" height="167" alt="" /><br /></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:SimSun">我们同时存在</span><span style="font-family:Calibri">libmyhello.a</span><span style="font-family:SimSun">和</span><span style="font-family:Calibri">libmyhello.so</span><span style="font-family:SimSun">，我们发现运行的时候，出现找不到动态库的错误，由此，我们可以得出结论，同时存在动态库和静态库的时候，</span><span style="font-family:Calibri">gcc</span><span style="font-family:SimSun">会优先选择动态库</span></p></div><img src ="http://www.cppblog.com/yg2362/aggbug/182832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yg2362/" target="_blank">梨树阳光</a> 2012-07-11 15:15 <a href="http://www.cppblog.com/yg2362/archive/2012/07/11/182832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>