﻿<?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++博客-来吧，一起加入高效编程吧………-文章分类-Unix/Linux</title><link>http://www.cppblog.com/xiaoyu0720/category/15559.html</link><description>我选择C++！但我喜欢Java</description><language>zh-cn</language><lastBuildDate>Wed, 01 Dec 2010 21:48:21 GMT</lastBuildDate><pubDate>Wed, 01 Dec 2010 21:48:21 GMT</pubDate><ttl>60</ttl><item><title>在linux下创建并使用动态链接库的方法介绍</title><link>http://www.cppblog.com/xiaoyu0720/articles/135193.html</link><dc:creator>编码者</dc:creator><author>编码者</author><pubDate>Wed, 01 Dec 2010 14:13:00 GMT</pubDate><guid>http://www.cppblog.com/xiaoyu0720/articles/135193.html</guid><wfw:comment>http://www.cppblog.com/xiaoyu0720/comments/135193.html</wfw:comment><comments>http://www.cppblog.com/xiaoyu0720/articles/135193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaoyu0720/comments/commentRss/135193.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaoyu0720/services/trackbacks/135193.html</trackback:ping><description><![CDATA[注明：我用的Linux系统版本为"Ubuntu 10.04.1 LTS"<br>在linux下创建并使用动态链接库的方法介绍<br>&nbsp;&nbsp;&nbsp; 1.首先我们要在主机上创建一个我们自己的函数库目录来保存我们的动态链接库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件~/library/lib<br>&nbsp;&nbsp;&nbsp; 2.然后我们必须要有自己的链接库的源码目录~/library/src<br>&nbsp;&nbsp;&nbsp; 3.我们以一个例子来说明如何创建并使用动态链接库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两个源码文件libfruit.c和test.c，源码放在文章最后面，前者用于生<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成动态链接库libfruit.so，后者用于测试函数调用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译动态链接库的makefile为<br>all: libfruit.so install clean<br><br>libfruit.so:libfruit.o<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @echo "********************making dynamic linked library*************"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc -shared -o libfruit.so libfruit.o<br>libfruit.o:libfruit.c<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc -fpic -c libfruit.c<br><br>install:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @echo "*********************installing ......************************"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mv ./libfruit.so ${LD_LIBRARY_PATH}<br>clean:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @echo "*********************cleaning....*************************"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rm -f ./libfruit.o ./libfruit.so <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makefile的格式我不多说，值得说明的一点是其中的LD_LIBRARY_PATH变量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是需要在makefile外面设置的，可以手动执行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export LD_LIBRARY_PATH=~/library/lib<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也可以将该行命令加到.profile中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中的-fpic选项用于编译生成与平台无关的代码.o文件，然后在ld链接器使用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -shared选项生成共享链接库文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来测试一下链接库中的函数println<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make一下test.c文件，详细makefile内容如下：(其中的\t被文本替换成了空格)<br><br>CFLAGS=-L${LD_LIBRARY_PATH} -lfruit -g <br><br>CXX=cc <br><br>TARGET=run<br><br>OBJS=test.o<br><br>all:${TARGET} ### clean<br><br>${TARGET}:${OBJS}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${CXX} -o $@ $?&nbsp; ${CFLAGS}<br><br>*.o:*.c<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${CXX} -c $&lt; ${CFLAGS}<br><br>clean:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rm -f *.o ${TARGET}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里面需要为编译器指定链接库所在的目录，使用的是-Ldir选项，由于<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量LD_LIBRARY_PATH已经保存了链接库所在目录，因此我们使用了它。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后告诉编译器需要在那个链接库文件中查找,使用-lx选项，如本次需要<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查找到链接库文件为libfruit.so，就需要使用-lfruit选项(链接库必须以lib开头的)。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行make命令后，生成了可执行文件run。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行一下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./run<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出结果:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hello World Test<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>测试用的源代码如下：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">//file:libfruit.c<br>#ifndef&nbsp;__LIBFRUIT_C__<br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;__LIBFRUIT_C__</span><span style="color: #000000;"><br>#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;println(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">msg)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br>//file:test.c<br>#ifndef&nbsp;__TEST_C__<br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;__TEST_C__</span><span style="color: #000000;"><br><br>#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc&nbsp;,</span><span style="color: #0000ff;">char</span><span style="color: #000000;">**</span><span style="color: #000000;">&nbsp;argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello&nbsp;World&nbsp;Test</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br><br><br><br></span></div>
<br><br><img src ="http://www.cppblog.com/xiaoyu0720/aggbug/135193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaoyu0720/" target="_blank">编码者</a> 2010-12-01 22:13 <a href="http://www.cppblog.com/xiaoyu0720/articles/135193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>