您的位置:首页 > 编程语言 > C语言/C++

C/C++:C/C++静态连接库(lib)的设计与应用

2009-02-06 17:16 211 查看
http://210.40.7.188/E'ojc/C/C_032/000.asp

C/C++:C/C++静态连接库(lib)的设计与应用
文件:mylib01.h(公布),
mylib01.cpp(生成静态库使用),test.cpp(使用静态库);

(1)C++程序设计的标准模式分三部分:例:程序
my01.CPP

(a)包含文件、全局常量变量定义(尽量少用或不用)、函数与方法说明,可写作一个单独的(***.h)文件;
(b)在Main()里调用(a)里的常量变量、函数方法完成某件工作;
(c)函数与方法的定义;

//部分a:包含文件、全局常量变量、函数与方法说明,可写作一个单独的(***.h)文件,

#include "my01.h"

//部分b:使用有关函数编程

void main(){

int kkk=1000;
cout<<sum1(100)<<endl;

cout<<sum2(100,200)<<endl;

cout<<sum1(999)-sum2(100,200);

cout<<sum3(&kkk)<<endl;
}

//部分c:函数的具体定义

int sum1(int n){

int sum = 0;

for ( int i = 1; i <= n; i++ )sum += i;

return sum;

}
int sum2(int n,int m){
int sum = 0;

for ( int i = n; i <= m; i++ )sum += i;

return sum;

}
int sum3(int *n){
int sum = 0;

for ( int i = 1; i <= *n; i++ )sum += i;

return sum;

}

其中头文件my01.h(放在my01.cpp的目录下;也可放在您需要的其它目录但编译时要设置)为:

#include <iostream.h>
int sum1(int n);
//计算(传值):1+2+…+n
int sum2(int n, int m);
//计算:n+(n+1)+…+m
int sum3(int *n);
//计算(传址):1+2+…+ n

(2)一个应用软件设计实现后,交给用户使用,

用户需要了解掌握的是(a)与(b),一般不关心(c),同时一般不要求改动(c)(或者不希望公布这里的代码),因此,应用软件常将(c)做成静态连接库使用。

(3)VC++6静态连接库的生成:

第一步:将C++应用程序按标准模式写成三部分,调试通过(实质在调试设计的函数、过程);
第二步:
建立VC++6的Win32 Static Library项目(location为:c:/000,name为mylib01,将生成mylib01.lib),将my01.cpp删除部分(a)与(b)得mylib01.cpp,将它与my01.h加入到本工程中;这时即可编译、生成mylib01.lib(在子目录/debug里)

(4)VC++6静态连接库的使用:

使用静态连接库mylib01.lib:将已经生成的mylib01.lib拷贝到某个特定目录(例如:c:/000/c/),将my01.cpp的第二部分删除得:test.cpp,将test.cpp与my01.h放到某个目录里,生成一个空工程,将test.cpp加入这个工程后,选菜单的“Project
| Settings | Link”,在“Object/library Modules”栏里加入静态库:c:/000/c/mylib01.lib
“OK”后即可编译运行!
注意1:如果将静态库放到VC++6的目录的子目录/lib中,或放到工程的主目录中(即/000/xyz),则在““Object/library
Modules”栏里可直接加入静态库名:mylib01.lib”
注意2:对于使用类Class的OOP程序,生成静态库使用的方法与上面是相同的。
注意3:生成静态库今后可在Windows下使用。

注意4:如果有一套设计好的lib,可专门放到一个目录,使用VC++6菜单“Tools
| Options | Directories Library Files ”将该目录加入,这样扩大VC++6的静态库


(5) 静态连接库的生成实验:

用static library项目(起名name: obj)使用下列代码生成obj.lib

//////文件:myobj.h:
#include <math.h>
#define pi 3.14159265359
int f2(int n);//计算2^n(递归函数)
class CVf2{//二分迭代解方程的抽象类
private:
double x1,x2,root;
public:

virtual double f(double)=0; //纯虚函数,在派生类中去实现

int Init(double a1,double a2);//{//找到有根区间[a1,a2],返回1

void f_2(void);//{//二分迭代解方程方法

double GetRoot(void){return root;}//返回方程的根
};
class Cf2:public CVf2{//类的实现
public:
double f(double x){return(x*x*x-100-sin(x));}
};

/////文件:objcxsj.cpp
#include "objcxsj.h"
#include <math.h>
int f2(int n){//计算2^n(递归函数)

if(n==0)return 1; else return f2(n-1)*2;
}
//二分迭代解方程的抽象类
int CVf2::Init(double a1,double a2){//找到有根区间[a1,a2],返回1

if(f(a1)*f(a2)>0)return 0; x1=a1;x2=a2; return 1; }
void CVf2::f_2(void){//二分迭代解方程方法

double fx0,fx1,fx2; fx1=f(x1);fx2=f(x2);

do{

root=(x1+x2)/2;fx0=f(root);

if(fx0*fx1<0){x2=root;fx2=fx0;}
else {x1=root;fx1=fx0;}

}while(fabs(fx0)>=0.00001);
}//;

在程序设计中应用生成的静态连接库obj.lib

注意:将obj.lib加入project时obj.lib与objtest.cpp在同一目录;也可将obj.lib放入VC++

的lib目录里,在LINK中加入obj.lib

/////文件:objtest.cpp
#include <iostream.h>
#include "objcxsj.h"
#include <math.h>
void main(){
cout<<"2的10次方="<<f2(10)<<endl;

Cf2 c,*cc; cc=&c;
double a1,a2;

do{

cout<<"请输入x1,x2:
"<<endl;cin>>a1>>a2;
}while(!(cc->Init(a1,a2)));
cout.setf(ios::floatfield);//浮点数输出
cc->f_2();cout<<"方程的根为:"<<cc->GetRoot()<<endl;
}//输出:方程的根为:4.62612

作业:(1)在Windows程序中应用静态库:obj.lib

(2)将myfounc0.cpp的函数与类做成静态库使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: