[讨论] 让我们来一次简单的 程序库 之旅(1)

辛昕   2013-6-18 01:44 楼主
写程序有一段时间后,我相信,库 这个名词你一定经常听说。不过,关于库,你知道多少呢,你又怎么使用过它呢?

很久没有在这个版块里发帖了,接下里我打算来写一下 库 这个话题的几个帖子。

闲话少说。

说到库,还是从我们最熟悉的 C库 开始。

从Helloworld开始,你其实一直在使用库,事实上,在PC上写C程序,如果没有库,你可能连 输出 Helloworld都成问题。

我们都知道,printf是一个函数,用它可以在屏幕上 输出我们要输出的信息。
我们自己也写过函数,像什么Add(3,4)之类的。
但是在你使用这个简单的加法函数以前,你想必写过类似于
  1. int Add(int a,int b)
  2. {
  3.      return (a+b);
  4. }
这样的函数定义/或者叫 函数实现,当然,你们更喜欢叫 函数体。

那么,printf呢?从我们一无所知开始写helloworld开始,你从没写过 printf()的函数体,但是你却不断地使用它。

当然,你被告知,这是 C库里有的,其实,对我来说,刚学的时候,我根本不知道什么叫C库,更不知道什么 调用库,我想,你也和我一样,当时只是觉得“嗯,这东西电脑里,有什么东西自动实现了”。

然而,任何一句C代码都是由人,或是我们自己,或是别人为我写的。不是所谓的 “自动实现,或者本来就存在的”

实现printf这个函数(当然还有很多其他的函数,如scanf(),如 getchar()...)
是由一个叫 C标准库 的东西实现的。

但是关于它,你了解多少呢?
你有没想过,你自己也可以 制作一个属于你自己的库,让你可以像轻松调用printf那样地调用那些你写了很多次,而且经常使用的函数呢?

下面,让我们开始一次对 库 的简单之旅。

回复评论 (3)

作为一个例子,我们首先封装一个 简答的库 STEP 1

嗯,不要太多,我们要封装的就是 这个 Add函数。

按照以前的作法,你大概会这样做。

打开一个编译器,诸如此类......
  1. #include

  2. int Add(int a,int b)
  3. {
  4.      return (a+b);
  5. }

  6. int main(void)
  7. {
  8.       printf("3 + 4 = %d\n",Add(3,4));
  9.       return 0;
  10. }
这没问题,无论是你的VC6还是VS2008,或者我的mingw都没问题。

但是今天我们要试一个不一样的作法。
点赞  2013-6-18 01:47

STEP 2

当然,封装库,对于不同的ide,不同的编译环境,操作方法略有不同。楼主习惯采用gcc编译器,所以是命令行。

对于熟悉vc或者其他编译器的你来说,相信你稍微找一找,就能找到相应的操作方法。

这里我先用gcc做一次演示。

首先,建立一个文件夹,就叫 UsingLib
在下面建立一个文件叫 Fun.c

在里面输入
那个Add()函数的实现

然后打开 终端,输入命令,编译。
gcc -c Fun.c -o Fun.o

然后我们会得到一个Fun.o

然后,我们删掉这个Fun.c 没错,这才能说明问题,删掉它。

然后新建一个 Main,c 键入如下内容
  1. #include

  2. int Add(int a,int b);

  3. int main(void)
  4. {
  5.     printf("3 + 4 = %d\n",Add(3,4));
  6.     return 0;
  7. }
注意哦,我们没有 Add()这个函数的声明哦。

然后继续命令行编译

gcc Main.c Fun.so -o Main,exe

编译没错误
然后我们得到一个Main.exe
很好,我们运行。结果很让我们满意
例子

[ 本帖最后由 辛昕 于 2013-6-18 02:01 编辑 ]
点赞  2013-6-18 02:00
事情没有到这一步结束
这只是开始,展示如何 做一个简单的库和使用库的过程

这些事情,在单片机上也完全可以用,比如你熟悉的51的keil,或者 430啊,stm32的iar上都一样。

以后我会把例子重点放在iar,我个人使用的是stm8,但实际上操作都是一样的。

当然我知道,你们可能更熟悉的VC6

在这里,我想请 51的小斑竹 bintimes帮个忙,为这个帖子,增加一个 VC6的实例。

相应的操作,只是选择编译执行出来的是库 还是 可执行exe而已
因为我在IAR上就是这样操作的。

谢谢了,bintimes。

这只是开始,接下来我们会继续探讨 封装库的一些要注意的地方,一些原则
以及最重要的,为什么要封装。将以实例和代码说明。
点赞  2013-6-18 02:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复