Windows 下VC++6.0制做、使用动态库和静态库html
1、VC++6.0制做、使用静态库编程
静态库制做windows
1.如图一在VC++6.0中new一个的为win32 static library工程并新建一个.cpp和一个.h(C++header file)文件app
2..cpp程序直接照老师给的打,注意这里须要改错,去掉(long) 编程语言
3. .h文件须要本身编写格式以下。以head.h为例函数
#ifndef _HEAD_H_测试
#define _HEAD_H_ui
unsigned long unsgn_pow(unsigned int,unsigned int);spa
#endifdebug
4.Build
5.此时会在根目录debug文件夹中生成一个.lib文件这就是咱们要的静态库
静态库使用
1.New 一个普通空白测试cpp文件(不要创建新的工程否则会报错)。将测试代码输入。测试代码越简单越好,至于
老师给的代码反正我没看懂。我直接将赋值那段代码改成本身输入x,y的值了。
2.在测试代码中包含(#include "head.h")
3.工程->设置->链接->输入->对象/库模块中添加你所生成的.lib文件。
(遇到无数错误,这样应该能一次做出)下面给出一些错误的调试方法。
链接栏中没有对象/库模块 提示找不到lib
可能 须要在tools/options设置正确的引用路径
2、VC++6.0制做、使用动态库
动态库知识普及
一)动态连接库和静态连接库
静态连接库:lib中的函数不只被链接,所有实现都被直接包含在最终生成的EXE文件中,只是实现是不可见的。
动态连接库:dll没必要被包含在最终的EXE中,静态调用时仅把函数名或者变量名或者类名连接到EXE文件中,而这些东西的实体都只有在运行时才从动态库中导入到可执行文件中,动态调用的时候EXE文件执行时能够直接动态地引用和卸载DLL文件。
同时,静态连接库中不能再包含其余的动态连接库或静态库,而动态连接库中能够包含其余的动态或静态库。
(二)回顾一下VC++支持的DLL:
DLL的编制与具体的编程语言及编译器无关,动态连接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序没法调用它们。
(三)导出函数的声明方式:
一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。
另一种采用模块定义(.def)文件声明,须要在库工程中添加模块文件,格式以下:
LIBRARY 库工程名称
EXPORTS 导出函数名
(四)DLL的调用方式:
静态调用中,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
动态调用中,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。
动态库制做
1. VC++6.0中new一个的为win32 Dynamic-Link Library工程,建立.cpp和.h文件。
2.将库代码和h文件敲入,这里须要注意要在函数定义时加前缀
extern "C" __declspec(dllexport) //声明为C编译、链接方式的外部函数
cpp和h文件均要加入前缀,这样才能产生lib文件,否则只有dll文件。
3.Bulid
4.在根目录下的debug文件中就会找到dll和lib文件
(通常的动态库在建立工程时候会选择 New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL,这样会产生标准的def.文件方便再次使用)
动态库使用(将dll文件和lib文件考入测试工程所在目录)
1°静态调用
1. new--projects--win32 console application--an empty project
2. 添加h文件:(test.h) (.h能够写到.cpp文件中)
#pragma comment(lib,"xxxx.lib") //告诉编译器DLL相对应的lib文件所在路径和文件名
extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入函数
3. 添加测试cpp文件
2° 动态调用
即采用LoadLibrary()函数对dll文件直接调用,以下列代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>//LoadLibrary所须要的头文件
typedef int (* Peal)(int ,int);//定义一个名为Peal的与unsgn_pow函数接受参数类型和返回值均相同的函数指针类型
int main()
{
HINSTANCE Linke;//建立名为Linke的句柄
Peal unsgn_pow;//将指针Peal指向函数
Linke=LoadLibrary("dfg123.dll");//动态加载DLL模块句柄
if(Linke)
{
unsgn_pow=(Peal) GetProcAddress(Linke,"unsgn_pow");//获得所加载DLL模块中函数的地址
if(unsgn_pow)
{
unsigned int x,y;
unsigned long res;
printf("ple input 2 number(int)\n");
scanf("%d %d",&x,&y);
res =unsgn_pow(x,y);
printf("%u ^ %u=%u\n", x, y, res);
exit(0);
}
FreeLibrary(Linke);//释放
}
return 0;
}
注意:若是你按照个人测试代码运行的话结果以下
原代码运行答案 传参数为argv[1]=2 argv[2]=3 argv[3]= 4 argv[4]=5