windows库
1、windows库的存在方式
1.1、静态库:不能被加载的程序,可以理解为目标程序的归档;*.lib。
1.2、动态库:是可以被加载的程序;*.dll。
2、静态库
2.1、静态库的特点
目标程序的归档;
静态库的代码会被嵌入到程序当中;
程序执行时不需要静态库存在;
致使程序很大。
2.2、C语言的静态库
2.2.1、创建静态库
创建Win32静态库项目,使用*.c文件建立项目。
2.2.2、添加静态库函数
2.2.3、在程序中将静态库导入
项目设置中可以添加lib文件;
或者使用关键字pragma。
#pragma comment(lib,"../Lib/Winclib.lib")
2.2.4、使用静态库提供的函数
在C语言程序中,直接使用函数即可。
2.2.5、实例,(使用项目设置链接编译输出目录等,将库文件输出在../Lib/下,执行程序输出在../Bin/下)
2.2.5.1、vc++6.0创建一个静态库项目,添加源文件winclib.c,代码如下
int C_Add( int nAdd1, int nAdd2 ){
return ( nAdd1 + nAdd2 );
}
int C_Sub( int nSub1, int nSub2 ){
return ( nSub1 - nSub2 );
}
winclib.c
编译后为winclib.lib
2.2.5.2、vc++6.0创建一个win32控制台应用程序,添加源文件useclib.c,代码如下
//导入静态库;
#pragma comment(lib,"../Lib/Winclib.lib") int main( )
{
int nAdd = ;
int nSub = ; //使用静态库函数;
nAdd = C_Add( , );
nSub = C_Sub( , ); printf( "ADD:%d\n", nAdd );
printf( "SUB:%d\n", nSub ); return ;
}
useclib.c
注意,编译时会出现警告,但是不影响编译和连接;
编译后为uscclib.exe
2.3、C++语言的静态库
2.3.1、创建静态库
创建win32静态库项目,使用*.cpp文件建立项目。
2.3.2、添加静态库的函数
2.3.3、导入静态库
#pragma comment( lib, "../Lib/Wincpplib.lib")
2.3.4、定义库函数的原型
extern int CPP_Add(int nAdd1, int nAdd2 );
extern int CPP_Sub(int nSub1, int nSub2 );
2.3.5、使用库函数
2.3.6、实例
2.3.6.1、vc++6.0创建一个静态库项目,添加源文件wincpplib.cpp,代码如下
int CPP_Add( int nAdd1, int nAdd2 ){
return ( nAdd1 + nAdd2 );
}
int CPP_Sub( int nSub1, int nSub2 ){
return ( nSub1 - nSub2 );
}
wincpplib.cpp
2.3.6.2、vc++6.0创建一个win32控制台应用程序,添加源文件usecpplib.cpp,代码如下
#include "stdafx.h" //导入C++的静态库;
#pragma comment( lib, "../Lib/Wincpplib.lib") int main()
{
int nAdd = CPP_Add( , );
int nSub = CPP_Sub( , ); printf( "ADD:%d\n", nAdd );
printf( "SUB:%d\n", nSub ); return ;
}
usecpplib.cpp
2.3.7、在C++文件中使用C源文件生成的库
注意:此时,需要看C源文件使用的是C编译器还是C++编译器来生成的库,
若是使用C编译器生成的库,需要额外加extern "C"代码;
若是使用C++编译器生成的库,可不需要加这样的代码。
如下:
extern "C" {
int C_Add(int nAdd1, int nAdd2 );
int C_Sub(int nSub1, int nSub2 );
}
vc++6.0创建一个win32控制台应用程序,添加源文件usecpplib.cpp,代码如下
#include "stdafx.h" //导入C++的静态库;
#pragma comment( lib, "../Lib/Wincpplib.lib") //导入C的静态库;
#pragma comment(lib,"../Lib/Winclib.lib") //定义函数原型;注意:extern可加可不加;
extern int CPP_Add(int nAdd1, int nAdd2 );
extern int CPP_Sub(int nSub1, int nSub2 );
//此时,extern必须使用;
extern "C" {
int C_Add(int nAdd1, int nAdd2 );
int C_Sub(int nSub1, int nSub2 );
} int main(int argc, char* argv[])
{
int nAdd = CPP_Add( , );
int nSub = CPP_Sub( , ); printf( "ADD:%d\n", nAdd );
printf( "SUB:%d\n", nSub ); int nAdd2 = C_Add( , );
int nSub2 = C_Sub( , ); printf( "ADD:%d\n", nAdd2 );
printf( "SUB:%d\n", nSub2 );
return ;
}
wincpplib.cpp
3、动态库
3.1、动态库的特点
可以提供模块化的方式,方便协调开发。
对源代码保护。
减少可执行文件的大小
提高代码的重用率。
3.2、动态库的基本使用方法
动态库的创建
加载动态库
获取并使用库函数、变量或类
释放动态库
3.3、函数的动态库
3.3.1、动态库的创建
创建DLL的项目
增加动态库的函数
导出动态库函数:需要使用__declspec(dllexport)代码。
3.3.2、动态库的使用
3.3.2.1、隐式链接
导入LIB
定义函数原型
使用函数
注意:这些库是Dll动态库的映射表。
大量的win32的API基本都是使用的隐式链接,如kernel32.lib、user32.lib、gdi32.lib
实例:
vc++6.0创建一个静态库项目,添加源文件DllFunc.cpp,代码如下
__declspec(dllexport) int Dll_Add( int nAdd1, int nAdd2 ){
return ( nAdd1 + nAdd2 );
}
__declspec(dllexport) int Dll_Sub( int nSub1, int nSub2 ){
return ( nSub1 - nSub2 );
}
DllFunc.cpp
vc++6.0创建一个win32控制台应用程序,添加源文件CallDllFunc.cpp,代码如下
#include "stdafx.h" //隐式导入DLL的Lib文件;
#pragma comment( lib, "../Lib/dllfunc.lib") //定义函数原型;
int Dll_Add( int nAdd1, int nAdd2 );
int Dll_Sub( int nSun1, int nSub2 ); int main(int argc, char* argv[])
{
int nAdd = Dll_Add( , );
int nSub = Dll_Sub( , );
printf("Dll_Add:%d\n", nAdd );
printf("Dll_Sub:%d\n", nSub );
return ;
}
CallDllFunc.cpp
3.3.2.2、显示链接
windows库的更多相关文章
- windows库的创建和使用:静态库+动态库
windows库的创建和使用:静态库+动态库 一.静态库的创建和使用 1. 静态库创建 (1)首先创建projecttest,測试代码例如以下: 1) test.h void test_print ...
- c++MFC工程修改在共享DLL中使用MFC为使用标准Windows库的解决办法
由于创建MFC工程时,默认是在共享DLL中使用MFC,如果将此选项改成使用标准Windows库,会报如下错误 c:\program files\microsoft visual studio 9.0\ ...
- Windows的静态库使用步骤
windows库程序: 1.静态库程序 - 运行时不独立存在,会被链接到可执行文件或者动态库中,目标程序的归档. 文件扩展名:LIB 2.动态库程序 - 运行时独立存在,不会被链接到可执行文件或其他动 ...
- windows 10 删除库后自动恢复的解决方法
目录 什么是windows 库? 手动删除不行吗? 如何正确的"删除"? title: windows 10 删除库后自动恢复的解决方法 date: 2019-06-09 15:4 ...
- C++windows内核编程笔记day11 win32静态库和动态库的使用
windows库程序: 静态库: 源码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB 动态库: 函数被程序或其它动态库调用,被调用时,代码仅仅有1份,文件后缀.DLL 静态库( ...
- windows和linux环境下使用google的glog日志库
一.概述 glog是google推出的一款轻量级c++开源日志框架,源码在github上,目前最新release版本是v0.3.5. githut地址:https://github.com/googl ...
- Windows OS上安装运行Apache Kafka教程
Windows OS上安装运行Apache Kafka教程 下面是分步指南,教你如何在Windows OS上安装运行Apache Zookeeper和Apache Kafka. 简介 本文讲述了如何在 ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- 3DSlicer源代码编译过程vs2008+windows xp [转]
一 下载QT源代码编译 1. 简述 在 Windows2000/xp/vista 下,安装 VS2008, QT 4.7.2 :并在 VS2008上建立 QT 的集成开发环境,利用 VS2008 ...
随机推荐
- Android 中加载几百张图片做帧动画防止 OOM 的解决方案
Android 中加载几百张图片做帧动画防止 OOM 的解决方案 最近,项目中有个需求:就是要做一个帧动画,按理说这个是很简单的!但是我能说这个帧动画拥有几百张图片吗?...... 填坑一 ---帧动 ...
- 160606、springmvc中使用Spring Mobile
springmobile特点: 1.客户端设备识别:识别结果只有3种类型:NORMAL(非手机设备).MOBILE(手机设备).TABLET(平板电脑). 2.网站偏好设置:Spring 通过设备识别 ...
- Hibernate-sessio缓存的操作
首先咋们看一个图: flush:首先箭头是由缓存指向数据库,即当我调用 Session.flush()方法时它会强制使数据库的记录跟缓存 中的对象状态保持同步 ,如果不一致,就会发送Sql语句 ,保持 ...
- 剑指Offer——按之字形顺序打印二叉树
题目描述: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 分析: 我们都知道二叉树的层次遍历用的是队 ...
- HDFS集群安装
DFS集群安装: 1.准备工作 (1)虚拟机(电脑8G 磁盘500GB) (2)3台linux系统(1台namenode 2台datanode) 2.安装HDFS(软件) (1)关闭防火墙 firew ...
- lua连接数据库操作示例代码
lua连接数据库可以使用resty.mysql库 示例代码如下: local mysql = require "resty.mysql" local db, err = mysql ...
- Mybatis在Maven项目中使用
Mybatis概览 ORM是什么? ORM是Object Realtion Mapping的缩写,顾名思义,即对象关系映射. ORM是一种以面向对象的方式来进行数据库操作的技术.Web开发中常用的语言 ...
- Linux ssh服务
关于ssh服务不多说就提几句,1,机房的服务器一般都是通过远程连接登录的,远程登录就必然少不了ssh客户端.2,虚拟机每次都要点击进去,每次退出来也需要按Ctrl+Alt+Enter,也比较麻烦,有时 ...
- IT开发工程师的悲哀现状和可能前途
IT开发工程师的悲哀现状和可能前途 本文所指的开发工程师,仅指程序开发人员和以数字电路开发为主的电子工程师.当你选择计算机或者电子.自控等专业进入大学时,你本来还是有机会从事其它行业的,可你毕业时执迷 ...
- 002-java语言基础
一.安装卸载 卸载:控制面板 安装:下载对应版本 注意1.安装路径→尽量不要有空格和汉字 注意2.安装之后,jre可以不用安装,jdk中含有 二.环境变量 环境变量:理解,一些快捷路径.方便快速查找应 ...