<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>长夜慢慢兮，心越来越远！</title>
<link>http://blogger.org.cn/blog/blog.asp?name=jkit</link>
<description>冥思者的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[删除Windows的服务]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=14927</link>
<author>jkit</author>
<pubDate>2006/6/1 14:30:59</pubDate>
<description><![CDATA[
<P>　　总有一些程序将自己注册为windows的服务，而我们并不想要拥有它。虽然我们可以把这些服务禁用掉，但是它就像一坨大便，让人看了不爽，于是便有了本文的方法将它方便的删除掉。以下就是删除windows服务的程序，使用方法(假定该程序的名字是svcmgr.py): <BR>python svcmgr.py remove 服务名[， 服务名2, ...]<BR><BR>#/bin/env python</P>
<P>import win32serviceutil<BR>import win32service<BR>import win32event</P>
<P>class svc(win32serviceutil.ServiceFramework):<BR>&nbsp;&nbsp;&nbsp; _svc_name_ = "svc"<BR>&nbsp;&nbsp;&nbsp; _svc_display_name_ = "svc"<BR>&nbsp;&nbsp;&nbsp; def __init__(self, args):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; win32serviceutil.ServiceFramework.__init__(self, args)</P>
<P>if __name__=='__main__':<BR>&nbsp;&nbsp;&nbsp; import sys<BR>&nbsp;&nbsp;&nbsp; if len(sys.argv) &lt; 3:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'Usage:', __file__, 'remove &lt;svc_name&gt;'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys.exit(0)<BR>&nbsp;&nbsp;&nbsp; if sys.argv[1] != 'remove':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'Usage:', __file__, 'remove &lt;svc_name&gt;'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys.exit(0)<BR>&nbsp;&nbsp;&nbsp; names = sys.argv[2:]<BR>&nbsp;&nbsp;&nbsp; sys.argv = sys.argv[0:2]<BR>&nbsp;&nbsp;&nbsp; for name in names:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; svc._svc_name_ = svc._svc_display_name_ = name<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; win32serviceutil.HandleCommandLine(svc)</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[下载日本新闻的脚本]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=14681</link>
<author>jkit</author>
<pubDate>2006/5/24 9:45:24</pubDate>
<description><![CDATA[最近为了练习日语听力，经常去news24.jp听在线视听新闻，为了以后能反复的听，于是写了个脚本将新闻的视频和台词下载了下来。<BR>前提：安装python和flashget<BR><BR>1：登陆该网站将各段新闻的链接url拷贝下来，保存在文本文件里面，每行一个url，例如 http://www1.ntv.co.jp/news/wmtram/news.cgi?movie=060523007.cgi.300k.58850.html<BR><BR>2：下载的脚本<BR>命令行参数是第一步保存url的文本文件的名字<BR>import os, re<BR><BR>html_prev = 'http://www.ntv.co.jp/news/html/%s.html'<BR>wmv_prev = 'mms://wmt-od.stream.ne.jp/ntv/news/%s.wmv'<BR><BR>fg = r'call "C:\Program Files\FlashGet\flashget.exe"'<BR>target = r'D:\download\japanese\news\%s'<BR><BR>re_news = re.compile(r'.*movie=(\d+)\.cgi\.(\d+k)\.(\d+)\.html', re.I)<BR><BR>def download(downloadfile):<BR>&nbsp;&nbsp;&nbsp; lines = open(downloadfile, 'r').readlines()<BR>&nbsp;&nbsp;&nbsp; files = []<BR>&nbsp;&nbsp;&nbsp; for line in lines:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = re_news.match(line)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if m:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; files.append([m.group(1) + '_' + m.group(2), m.group(3)])<BR>&nbsp;&nbsp;&nbsp; for wmv,html in files:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.system(fg + ' ' + wmv_prev % wmv + ' ' + target % wmv[:6])<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.system(fg + ' ' + html_prev % html + ' ' + target % wmv[:6])<BR><BR>if __name__ == '__main__':<BR>&nbsp;&nbsp;&nbsp; import sys<BR>&nbsp;&nbsp;&nbsp; if len(sys.argv) &lt; 2:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'Usage: ', __file__, '&lt;download file&gt;'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys.exit(0)<BR>&nbsp;&nbsp;&nbsp; download(sys.argv[1])<BR><BR>3：下载完成了之后，因为wmv文件和其对应的html台词文件名字不一致，所以再处理一下，你可以简单的将html台词文件和其wmv文件改得一致，但是我更喜欢将html台词文件里面的台词取出来另存为文本文件。<BR>命令行同上，仍然是刚才那个保存url的文本文件<BR>import re<BR><BR>html_prev = '%s/%s.html'<BR><BR>re_html = re.compile('.*&lt;span class="shuyo_1"&gt;(.*?)&lt;/span&gt;.*&lt;br&gt;(.*)&lt;br&gt;.*&lt;br&gt;.*&lt;span class="shuyo_2"&gt;(.*?)&lt;/span&gt;', re.I | re.S)<BR>re_news = re.compile(r'.*movie=(\d+)\.cgi\.(\d+k)\.(\d+)\.html', re.I)<BR><BR>def processfile(downloadfile):<BR>&nbsp;&nbsp;&nbsp; lines = open(downloadfile, 'r').readlines()<BR>&nbsp;&nbsp;&nbsp; for line in lines:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = re_news.match(line)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if m:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process(m.group(3), m.group(1) + '_' + m.group(2))<BR><BR>def process(html, wmv):<BR>&nbsp;&nbsp;&nbsp; f = open(html_prev % (wmv[0:6], html), 'r')<BR>&nbsp;&nbsp;&nbsp; content = f.read()<BR>&nbsp;&nbsp;&nbsp; f.close()<BR>&nbsp;&nbsp;&nbsp; m = re_html.match(content)<BR>&nbsp;&nbsp;&nbsp; if m:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open(wmv[:6] + '/' + wmv + '.txt', 'w').write(m.group(1).strip() + '\n' + m.group(2).strip() + '\n\n' + m.group(3).strip())<BR><BR>if __name__ == '__main__':<BR>&nbsp;&nbsp;&nbsp; import sys<BR>&nbsp;&nbsp;&nbsp; if len(sys.argv) &lt; 2:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'Usage: ', __file__, '&lt;download file&gt;'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys.exit(0)<BR>&nbsp;&nbsp;&nbsp; processfile(sys.argv[1])<BR><BR>4：到这一步没啥说的了，开始视听吧。<BR>]]></description>
</item><item>
<title><![CDATA[怎样快速得到一批手机号码的归宿地]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=13607</link>
<author>jkit</author>
<pubDate>2006/4/19 15:21:50</pubDate>
<description><![CDATA[如果有一个文件，每行是一个手机号码，例如<br>
$cat 1.txt<br>
<span style="font-size: 13px;">
13711112365<br>
13823658999<br>
13978965413</span><br>
另外有一个手机号码归宿地对应表文件，例如<br>
$cat master.txt<br>
<span style="font-size: 13px;">
1300000&nbsp;&nbsp;bj&nbsp;&nbsp;bj<br>
1382365&nbsp;&nbsp;hb xt<br>
1397896&nbsp;&nbsp;sd sd<br>
1398000&nbsp;&nbsp;sc sc<br>
.......<br>
1：怎样得到每个手机号码对应的归宿地呢？<br>
[code]<br>
</span><span style="font-size: 13px;">awk 'NR==FNR{a[$1]=$2" "$3}NR&gt;FNR{i=</span><span style="font-size: 13px;">substr($1,1,7);</span><span style="font-size: 13px;">if (i in a) print $0,a[i]}' master.txt 1.txt<i><br>
</i>[/code]<br>
2：如果想根据归宿地分类怎么办呢？<br>
</span><span style="font-size: 13px;">[code]<br>
</span><span style="font-size: 13px;">awk 'NR==FNR{p[$1]=$2;c[$1]=$3}NR&gt;FNR{i=</span><span style="font-size: 13px;">substr($1,1,7);</span><span style="font-size: 13px;">if (i in p) print $0 &gt;&gt; p[i]"/"c[i]}' master.txt 1.txt<i><br>
</i>[/code]</span><br>]]></description>
</item><item>
<title><![CDATA[快速生成随机密码]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12870</link>
<author>jkit</author>
<pubDate>2006/3/24 14:21:50</pubDate>
<description><![CDATA[很多时候我们需要一批随机的密码，这些密码不能太simple，否则容易被猜出来，怎么办呢？有个很简单的办法能做到：<br>#!/bin/python<br>import string, random<br>x = string.ascii_letters[:] + string.digits[:]<br>max = len(x) - 1<br>pwdlen = 8<br>pwdnum = 10000<br>open('pwd.txt', 'w').writelines(['%s\n' % ''.join(x[random.randint(0,max)] for i in range(pwdlen)) for j in range(pwdnum)])<br><br>]]></description>
</item><item>
<title><![CDATA[python 命令行小技巧]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12817</link>
<author>jkit</author>
<pubDate>2006/3/22 19:13:47</pubDate>
<description><![CDATA[生成测试数据文件<br>python -c "file('tmp.txt', 'w').writelines('%d This is a test\n' % n for n in range(10000))"<br><br>测试语句执行效率<br>python -m timeit "open('tmp.txt').readlines()"<br>]]></description>
</item><item>
<title><![CDATA[maven dbunit 常用命令一览]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12813</link>
<author>jkit</author>
<pubDate>2006/3/22 18:20:35</pubDate>
<description><![CDATA[数据库 =&gt; xml文件<br>maven -o dbunit:generate-dataset [-Dtables=name1[,name2]]<br><br>数据库 =&gt; xls文件<br>maven -o dbunit:export-xls [-Dtables=name1[,name2]]<br><br>xml文件 =&gt; 数据库<br>maven -o -Dfile=&lt;xml-file-name&gt; dbunit:import-dataset<br><br>xls文件 =&gt; 数据库<br>maven -o -Dfile=&lt;xls-file-name&gt; dbunit:import-xls<br><br>xls文件 =&gt; xml文件<br>maven -o -Dinput=&lt;xls-file-name&gt; -Doutput=&lt;xml-file-name&gt; dbunit:xls2xml<br><br>xml文件 =&gt; xls文件<br>maven -o -Dinput=&lt;xml-file-name&gt; -Doutput=&lt;xls-file-name&gt; dbunit:xml2xls<br><br>]]></description>
</item><item>
<title><![CDATA[MinGW-GCC 如何编译JNI程序]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12794</link>
<author>jkit</author>
<pubDate>2006/3/22 13:44:16</pubDate>
<description><![CDATA[本文并非介绍如何编写JNI程序，相关资料可以参考java tutorial。这里只是简单示范如何用MinGW-GCC去编译JNI程序。<br><span style="font-weight: bold;"><br>第一步：编写java程序</span><br>public class HelloWorld {<br>&nbsp;&nbsp;&nbsp; public native void displayHelloWorld();<br><br>&nbsp;&nbsp;&nbsp; static {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.loadLibrary("hello");<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new HelloWorld().displayHelloWorld();<br>&nbsp;&nbsp;&nbsp; }<br>}<br>注意其中的代码<br>
&nbsp;&nbsp;&nbsp; public native void displayHelloWorld();<br>
&nbsp;&nbsp;&nbsp; 就是声明displayHelloWorld()这个方法是本地方法，需要在jni中实现。<br>
&nbsp;&nbsp;&nbsp; static {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.loadLibrary("hello");<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; 意思是载入库文件，意味着我们下面的jni程序最终需要打包成hello.dll<br><br><span style="font-weight: bold;">第二步：编译java程序</span><br><span style="font-style: italic;">javac HelloWorld.java<br><br></span><span style="font-weight: bold;">第三步：生成头文件</span><br><strong style="font-weight: normal; font-style: italic;">javah -jni HelloWorld<br><br></strong><strong style="font-weight: normal; text-decoration: underline;"></strong><strong style="font-weight: bold;">第四步：编写本地</strong><strong style="font-weight: bold;">实现</strong><strong style="font-weight: normal;"><span style="font-weight: bold;">代码</span><br>我们打开第三步生成的HelloWorld.h这个文件，找到其中的</strong><strong style="font-weight: normal;">方法</strong><strong style="font-weight: normal;">声明<br></strong><strong style="font-weight: normal;">JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld<br>&nbsp; (JNIEnv *, jobject);<br>这是jni的命名规范，具体</strong>可以参考java tutorial。这里只是方法声明，现在我们来实现它。<br>/*&nbsp; HelloWorldImp.c&nbsp; */<br>#include &lt;jni.h&gt;<br>#include "HelloWorld.h"<br>#include &lt;stdio.h&gt;<br><br>JNIEXPORT void JNICALL <br>Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) <br>{<br>&nbsp;&nbsp;&nbsp; printf("Hello world!\n");<br>&nbsp;&nbsp;&nbsp; return;<br>}<br><br><span style="font-weight: bold;">第五步：创建库文件</span><br>前面第一步里面提到过hello.dll，这里利用以前提到的制作动态库的命令来生成它。<br><span style="font-style: italic;">gcc -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -shared -o hello.dll HelloWorldImp.c</span><br>运行<br><span style="font-style: italic;">java HelloWorld</span><br>不好，出错了<br>Exception in thread "main" java.lang.UnsatisfiedLinkError: displayHelloWorld<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at HelloWorld.displayHelloWorld(Native Method)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at HelloWorld.main(HelloWorld.java:9)<br>意思是库文件已经成功载入了，但是没有找到相匹配的displayHelloWorld这个方法。可是我们明明实现了这个方法的呀？原来程序在调用动态库的时候，没有我们想象中的那么简单，而且不同的编译器做法不一样，windows版java中调用jni遵从的是vc的调用方式，和我们用的MinGW GCC默认格式不一致。我们需要调整一下参数，（注意其中的--kill-at）<br><span style="font-style: italic;">gcc -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -shared -Wl,--kill-at -o hello.dll HelloWorldImp.c</span><br>运行<br>
<span style="font-style: italic;">java HelloWorld<br></span>Hello world! 运行成功，great！<br><br><span style="font-style: italic;"></span>]]></description>
</item><item>
<title><![CDATA[Oracle数据库导入数据方法之一]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12713</link>
<author>jkit</author>
<pubDate>2006/3/20 13:36:35</pubDate>
<description><![CDATA[for /R . %f in (*.ctl) do SQLLDR.EXE userid=&lt;username&gt;/&lt;password&gt;@&lt;TNS&gt; control=%f]]></description>
</item><item>
<title><![CDATA[MinGW-GCC 如何编写win32应用程序]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12497</link>
<author>jkit</author>
<pubDate>2006/3/13 16:28:24</pubDate>
<description><![CDATA[&nbsp; 以前写出来的程序，在windows下用鼠标双击时，总是会蹦一个黑窗口出来，怎样才能让它不出来呢？那是因为以前的程序都是使用console模式即控制台模式编译的，所以运行的时候会有一个控制台窗口。我们现在来学习一下win32应用程序的写法。<br>第一，要包含windows.h这个头文件，并且主程序由传统的main变成了WinMain。如下<br>/*&nbsp; main.c&nbsp; */<br>#include &lt;windows.h&gt;<br><br>int WINAPI WinMain (HINSTANCE hInstance, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hPrevInstance, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PSTR szCmdLine, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iCmdShow) {<br>&nbsp;&nbsp;&nbsp; MessageBox (NULL, "Hello", "Hello Demo", MB_OK);<br>&nbsp;&nbsp;&nbsp; return (0);<br>}<br>第二：使用编译选项-mwindows<br>gcc -o hello main.c -mwindows<br><br>运行一下，看看是不是弹出一个消息框，而且黑乎乎的控制台窗口也没有了？<br>:D<br>]]></description>
</item><item>
<title><![CDATA[如何为应用程序创建图标]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12327</link>
<author>jkit</author>
<pubDate>2006/3/7 14:19:40</pubDate>
<description><![CDATA[用MinGW-GCC开发Windows程序的时候如何为我们的程序指定一个图标呢？其实很简单！<br>第一步：制作图标文件。我偷一下懒，找现成的，例如在apache目录下找到了一个图标 favicon.ico<br>第二步：编辑资源文件 app.rc (名字任意起，以.rc为后缀就行)<br>1 ICON "favicon.ico"<br>第三步：将其编译成目标文件<br>windres app.rc icon.o<br>&nbsp; （说明：windres 是MinGW带的一个实用程序，icon.o是生成的目标文件）<br>第四步：和往常一样编译，只是把icon.o也编译进去即可。<br>gcc -o hello *.c icon.o<br>看看生成的hello.exe的图标是不是变了？<br>enjoy it :-)<br><br>]]></description>
</item><item>
<title><![CDATA[GCC静态链接与动态链接(续)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12236</link>
<author>jkit</author>
<pubDate>2006/3/5 11:29:18</pubDate>
<description><![CDATA[有网友问到了如果程序里面同时用到了静态链接库和动态链接库，那该怎么办呢？其实很简单，还是以上贴的程序为例子，我们已经得到了静态库libhellos.a和动态库hellod.dll，我们现在修改一下主程序同时调用它们，如下<br>/*&nbsp; main.c&nbsp; */<br>#include &lt;stdio.h&gt;<br>#include "hellos.h"<br>#include "hellod.h"<br><br>main() {<br>&nbsp; char* text = "Hello World!\n";<br>&nbsp; printS(text);<br>&nbsp; printD(text);<br>}<br>编译链接：<br>gcc -o hello main.c hellod.dll libhellos.a<br>然后运行hello<br>print in static way: Hello World!<br>print in dynamic way: Hello World!<br>此时删掉libhellos.a，仍然能正常运行。如果删掉hellod.dll则会报找不到hellod.dll的错误。细心的读者可能注意到了，这次编译的命令和前面有点不一样，这是因为gcc自己会判断是动态库还是静态库，然后自动采取了相应的编译策略。]]></description>
</item><item>
<title><![CDATA[GCC静态链接与动态链接]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12170</link>
<author>jkit</author>
<pubDate>2006/3/3 11:50:30</pubDate>
<description><![CDATA[<a>　　传说中的GCC神功盖世，威力无比，今日一见，果然不同凡响。拿出收藏了多年的HelloWorld牛刀小试，</a><a>于是心悦诚服。<br>看代码：<br></a><a>１：建静态库<br>
</a><a>/*&nbsp; hellos.h&nbsp; */<br>#ifndef _HELLO_S_H<br>#define _HELLO_S_H<br><br>void printS(char* str);<br><br>#endif<br><br>/*&nbsp; hellos.c&nbsp; */<br>#include "hellos.h"<br><br>void printS(char* str) {<br>&nbsp; printf("print in static way: %s", str);<br>}<br>输入命令：<br>gcc -c -o hellos.o hellos.c<br>ar cqs libhellos.a hellos.o<br>于是得到了</a><a>libhellos.a这么一个静态链接库<br><br>２：主程序<br>/*&nbsp; main.c&nbsp; */<br>#include &lt;stdio.h&gt;<br>#include "hellos.h"<br><br>main() {<br>&nbsp; char* text = "Hello World!\n";<br>&nbsp; printS(text);<br>}<br>编译链接：<br>gcc -o hello main.c -static -L. -lhellos<br>然后运行hello可以看到输出<br>print in static way: Hello World!<br>删除</a><a>libhellos.a和</a><a>hellos.*后, 程序仍然正常运行。</a><a><br><br>下面再来看</a><a>动态链接</a><a><br></a><a>３：建动态库<br></a><a>/*&nbsp; hellod.h&nbsp; */<br>#ifndef _HELLO_D_H<br>#define _HELLO_D_H<br><br>void printD(char* str);<br><br>#endif<br><br></a><a>/*&nbsp; hellod.c&nbsp; */<br>#include "hellod.h"<br><br>void printD(char* str) {<br>&nbsp; printf("print in dynamic way: %s", str);<br>}<br><br></a><a>输入命令：<br>gcc -shared -o hellod.dll hellod.c<br>
于是得到了</a><a>hellod.dll</a><a>这么一个动态链接库</a><a><br><br></a><a>４：</a><a>主程序<br>
/*&nbsp; main.c&nbsp; */<br>
#include &lt;stdio.h&gt;<br>
#include "hellod.h"<br>
<br>
main() {<br>
&nbsp; char* text = "Hello World!\n";<br>
&nbsp; printD(text);<br>
}<br>
编译链接：<br>gcc -o hello main.c -L. -lhellod<br></a><a>然后运行hello可以看到输出<br>print in dynamic way: Hello World!<br>如果这时候删除刚刚生成的</a><a>hellod.dll,再运行则会报告一个找不到</a><a>hellod.dll的错误，程序无法正常运行。<br><br>至此，GCC小发神威，</a><a>轻松</a><a>就让我们领略了静态链接和动态链接的威力。对了还没说环境呢，以上程序在WindowsXP sp2，gcc version 3.4.4 (mingw special) 下通过。如果想在linux下面试，只需要把生成的动态库的名字换一下（</a><a>hellod.dll ==〉libhellod.so</a><a>）即可。</a><a><br></a>]]></description>
</item><item>
<title><![CDATA[闭卷有益]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=jkit&amp;id=12169</link>
<author>jkit</author>
<pubDate>2006/3/3 11:37:21</pubDate>
<description><![CDATA[<a>　　一直以来都有写点东西的想法，一直都以没有时间来为自己的懒惰找借口，还是写点什么罢。写blog，存往事，寄予未来。<br>　　来这里之前本来并没有刻意注册ｂｌｏｇ，只是在ＸＭＬ论坛注册了个ｉｄ，没想到就这样有了ｂｌｏｇ可以写，加上我一直比较懒，于是先安个窟再说。<br>　　今天是阳春３月，可惜不能下扬州。三月三，捡金砖。看看今晚梦里能不能捡到一块金砖。　:D<br><br><br></a>]]></description>
</item>
</channel>
</rss>