第四部分 将可重用的部分做成静态库
4.1 导入示例项目
点此处可以下载本文中用到的两个C++项目(Eclipse+CDT项目,环境按第一部分的说明配置),下载后解压。
然后在Eclipse中使用File->Import->Genaral::Existing Project into Workspace向导即可把下载的项目导入到开发环境中。便会看到如下图的项目:
如果Build成功,Run起来以后,可以看到如下的运行结果:
这个例子实际上和上一部分中的例子效果是一样的。不同的是,本例中使用了静态库的方式来完成,这样更可以看出程序在扩展意义上的实践。那么如何建立一个静态库(static library)?又如何在另一个项目中引用这个库?下面两个小节就是分别回答这两个问题的。
4.2 静态库项目的建立
静态库项目的建立在CDT中是非常方便的。用新建向导中的 New -> C++ Project -> Static Library -> Empty Project即可建立成功。然后可以在该项目中进行代码的编写。如果编译成功,可以看到项目结构如下所示:
注意那个Archives里面生成的一个***.a文件,这就是代码编译生成的静态库。
4.3 静态库项目的调用
下面就来新建一个普通C++项目,来引用并调用上一小节库中的代码。新建的过程也很简单,就用新建向导中的New -> C++ Project -> Executable -> Empty Project即可。
建完以后,来添加对4.2中所建立的静态库的引用。
1:头文件
因为我们要对静态库中的类进行调用并扩展,所以一般需要引用静态库项目中的一个对外公布的头文件(如本例中的InshionLib.h)。
具体做法如上图所示,在/C/C++ Build -> Settings 中的GCC C++ Compiler的Directories中把需要引用的静态库的Include paths添加进来。这样做的目的是为了让Inshion_Exa002_Caller项目(下简称Caller项目)中的#include "InshionLib.h"能正确通过。
2:引用库和参数配置
当然,只引入头文件是远远不够的。以Caller项目为例,如果只是添加了头文件目录,然后就编译那几个源码的话,一般会出现如下的错误:
undefined reference to `WinMain@16'
undefined reference to `TextOutA@20'
undefined reference to `SetBkColor@8'
等等等等……
所以我们还需要把Lib项目生成的库引进来,同时设置WindowsAPI调用需要添加的配置参数。具体作法如下图所示:
具体地说就是在MinGW C++ Linker的Miscellaneous中的Other objects下,添加前文提到的静态库编译生成的***.a库文件。
然后设置-lmingw32和-mwindows参数,分别参照以下两图进行:
顺便提一下,其实-mwindows这个参数我们已经不陌生了,第三部分中就用过它,这里的使用与之是完全一样的。具体可参见本系列文章的第三部分。
这样设置完成以后,就可以再Build该Caller项目了,应该就可以通过:D。
4.3 其它可能遇到的问题
在对源代码或者编译参数进行修改了以后,最好使用Eclipse菜单的Project -> Clean 功能对项目进行一下清理,以保证再次生成的时候我们的所有修改都是生效有。
有时候,在对两个项目同时进行Clean并Build之后,会出现下面这样的提示:
..\: No such file: No such file or directory
其实他的意思是说那个***.a文件没有找到。这时候需要检查一下上文(4.2小节)提到的Archives里是否有我们想要的.a文件,如果我们的引用设置和Lib项目的.a文件都是正常的,说明这是Eclipse资源同步的问题,这时候并没有关系,再对Caller项目单独一下Build就行。
这个问题不仅现在会遇到,后面我们还会看到,在使用资源文件(.res)生成.o文件的时候,常常也会发生。通常是.o文件明明已经生成了,但Eclipse的项目里却看不到,这时候只需要用F5刷新(或者在项目上点右键选刷新)一下该项目就能看到我们需要的文件,再编译连接就能正常。
附:本文中的源代码项目下载(Inshion_Exa002.rar)