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. 快速安装elkstack

    一.介绍 The Elastic Stack - 它不是一个软件,而是Elasticsearch,Logstash,Kibana 开源软件的集合,对外是作为一个日志管理系统的开源方案.它可以从任何来源 ...

  2. CF865D Buy Low Sell High 贪心

    正解:贪心 解题报告: 传送门! 这题首先有个很显然的dp,太基础了不说QAQ 然后考虑dp是n2的,显然过不去,所以换一个角度 然后发现这题和普通的dp的题有什么不同呢?就它这儿是一天只能买一支股, ...

  3. 陌生的 metaclass(转)

    add by zhj:这是我见过的对metaclass解释最清楚的文章了,例子很好,真是一例胜千言 原文:http://wiki.jikexueyuan.com/project/explore-pyt ...

  4. ES6 --- JS异步编程的几种解决方法及其优缺点

    导言: 我们都知道 JS 是单线程的,这也正是异步编程对于 JS  很重要的原因,因为它无法忍受耗时太长的操作.正因如此有一系列的实现异步的方法. 方法一  setTimeout 常用于:定时器,动画 ...

  5. css权重计算规则

    1.第一等:代表内联样式,如 style=" ",权值为1000: 2.第二等:代表ID选择器,如 #content,权值为0100: 3.第三等:代表类,伪类和属性选择器,如 . ...

  6. wps去广告

    彻底解决WPS弹出热点广告.WPS购物图标的办法 方法一:(一定有效) https://www.cnblogs.com/ytaozhao/p/5654149.html 一直用WPS,但一直有一个问题迟 ...

  7. InnoDB Lock

    众所周知innodb的锁是行级锁,这样说也没有问题,只是还可以细分而已.推荐阅读何登成大牛的博客http://hedengcheng.com/?p=771 innodb的锁有三种算法,分别如下: Re ...

  8. laravel项目ThinkSNS+安装

    ThinkSNS+ 是一个使用 Laravel 开发,并且功能繁多且健壮的社交程序.今天我们来跟着ytkah一起来尝鲜一下.首先PHP 版本必须大于 7.1.3,已经下载并安装过 Composer,拥 ...

  9. Python3学习之路~2.7 文件操作

    对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 Somehow, it seems the love I knew was always the ...

  10. oracle sql 游标的简单用法(tip:sql中两个单引号表示一个单引号)

    --游标遍历某个字段 (打印出来) declare            res_sql varchar2(2000); cursor cur is            select f_dcnam ...