Windows VC++6.0制作使用动态库和静态库

一、VC++6.0制作、使用静态库

静态库制作

1.如图一在VC++6.0中new一个的为win32 static library工程并新建一个.cpp和一个.h(C++header file)文件

2..cpp程序直接照老师给的打,注意这里需要改错,去掉(long)

3. .h文件需要自己编写格式如下。以head.h为例

#ifndef _HEAD_H_

#define _HEAD_H_

unsigned long unsgn_pow(unsigned int,unsigned int);

#endif

4.Build

5.此时会在根目录debug文件夹中生成一个.lib文件这就是我们要的静态库

静态库使用

1.New 一个普通空白测试cpp文件(不要建立新的工程不然会报错)。将测试代码输入。测试代码越简单越好,至于

老师给的代码反正我没看懂。我直接将赋值那段代码改为自己输入x,y的值了。

#include <stdio.h>
#include <stdlib.h>
#include "head.h"
int main(void)
{
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);
}

2.在测试代码中包含(#include "head.h")

3.工程->设置->连接->输入->对象/库模块中添加你所生成的.lib文件。

(遇到无数错误,这样应该能一次作出)下面给出一些错误的调试方法。

连接栏中没有对象/库模块   提示找不到lib

可能 需要在tools/options设置正确的引用路径

二、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

Windows 下VC++6.0制作、使用动态库和静态库的更多相关文章

  1. Win7下vc++6.0打开项目出现问题的解决方案

    Win7下vc++6.0打开项目出现Microsoft(R) Developer Studio以及Unable to register this add-in because its DLLRegis ...

  2. windows下mysql 8.0.12安装步骤及基本使用教程

    本文实例为大家分享了windows下mysql 8.0.12安装步骤及使用教程,供大家参考,具体内容如下 补充:mysql 已经更新到了 8.0.19,大致步骤和这个差不多,照着来就完事了. 我下载的 ...

  3. 技巧:Linux 动态库与静态库制作及使用详解

    技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...

  4. VC 静态库与动态库(二)静态库创建与使用

    1.新建项目,创建项目和解决方案 StaticLibrary  这是静态库项目 G:\C++Learn\Library  Library文件夹用于存放库相关文件,包含静态库与后面的动态库工程和解决方案 ...

  5. Linux下动态库和静态库的生成和使用

    1.准备头文件和源文件 hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name): #endif hello.c #in ...

  6. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

  7. VS2008 动态库和静态库的生成和加载

    第一:动态库和静态库的生成: 1) 新建一个生成dll工程: 文件->新建->项目->Win32->Win32控制台应用程序 输入项目名称:dllTest ,项目路径:D:\V ...

  8. GCC 指令详解及动态库、静态库的使用

    GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...

  9. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

随机推荐

  1. spring相关的maven依赖

    <properties> <springframework.version>5.0.4.RELEASE</springframework.version> < ...

  2. 20165336 实验一 Java开发环境的熟悉

    20165336 实验一 Java开发环境的熟悉 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:康志强 学号:20165336 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验 ...

  3. router 设置时 模板的新引法

    { path: '/Index1', name: 'Index', component: () => import ('@/components/Index.vue') },

  4. Java 用HTTP的方式发送JSON报文请求

    前言: 项目调用第三方接口时,通常是用socket或者http的通讯方式发送请求:http 为短连接,客户端发送请求都需要服务器端回送响应,请求结束后,主动释放链接.Socket为长连接:通常情况下S ...

  5. JavaScript, DOM查找元素

    1.document.getElementById("id"); => IE8 及较低版本不区分ID的大小写 => IE7及较低版本中表单元素的name特性和ID都会被 ...

  6. 关于安装SVN Service 出错 Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details

    关于安装SVN Service 出错 Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in ...

  7. thinkphp无法安装提示修改mysql配置

    在安装以thinkphp为框架的系统时数据库连接错误,提示修改sql-mode或sql_mode为NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION.那我们就顺着提示 ...

  8. Python3学习之路~6.3 类变量 VS 实例变量

    类变量 VS 实例变量 #Author:Zheng Na # 实例里面可以查询.增加.删除.修改实例变量 class Role: # 类名 # 类变量 name = '我是类name' n=1 n_l ...

  9. 【SVD、特征值分解、PCA关系】

    一.SVD    1.含义: 把矩阵分解为缩放矩阵+旋转矩阵+特征向量矩阵. A矩阵的作用是将一个向量从V这组正交基向量的空间旋转到U这组正交基向量的空间,并对每个方向进行了一定的缩放,缩放因子就是各 ...

  10. k皇后

    http://www.cnblogs.com/drizzlecrj/archive/2007/10/04/913703.html