C语言中静态库和动态库笔记
库
库,故名思议,是存放东西的地方,其中存放的东西可以被多个人公用。
程序中借用库的概念,描述将代码进行抽取,这种代码被大多数程序使用,
其过程具有一定的模块化、封装、抽象的特征。
按照库的使用方式, 静态库 和 动态库。
不管怎样方式使用, 首先库的概念体现出代码逻辑上公共抽象。
有篇博文,做了介绍, 并有例子, 本文纯粹学习,借鉴了其中的例子。
http://www.cnblogs.com/chio/archive/2007/11/03/948480.html
静态库
静态库,编译应用程序的过程中, 就将代码编译进去引用程序,
使用上, 只要引用库的开放头文件, 在应用代码中就像引用应用自己的函数一样。
对于这种库,
linux编译的后缀为 .a (archive, 从命名上可以看出,仅仅是归档的作用, 跟文件夹和若干相关的文件关系类似)
windows为.lib (library)
动态库
动态库,在编译阶段,没有将库文件编译进入应用,
而是在执行阶段,将动态库加载到内存打开,按照函数名找到函数后执行,
在应用编码中, 使用特有的动态库接口来 打开库, 找函数, 关闭库等,具体接口跟平台有关:
windows : http://msdn.microsoft.com/en-us/library/ms682599(v=vs.85).aspx
Linux:http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/index.html
windows编译动态库文件的后缀为 .dll (dynamic library Linker)
Linux的动态库文件为.so (shared object = 从使用场景给了最好的解释, 首先是executable object, 然后各个程序都可以执行阶段动态分享 shared)
与静态库相比,
(1)动态库更加省内存,只在需要的时候加载。
(2)省空间,如果多个程序引用, 只有一份目标文件大小, 静态库是各个应用都编译进去。
(3)使用方式更加灵活,可以对库更加灵活替换或者升级。
所以对于本地应用开发, 系统都提供了一些本地应用库,给开发者使用,例如c库 libc.so。
实验 -- 静态库
本实验使用C-FREE作为编译开发运行环境。 C-FREE DOWNLOAD ADDRESS http://www.programarts.com/cfree_ch/index.htm
做一个加法计算的动态库,然后由应用调用。
静态库-libStatic.a
addFuncLib.cpp
#include "addFuncLib.h"
int add(int x,int y)
{
return x + y;
}
addFuncLib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y); //声明为C编译、连接方式的外部函数
#endif
应用 编译时候,需要将libStatic.a添加到此工程。
callAddFunc.cpp
#include <stdio.h>
#include ".\\addFuncLib.h"
int main(int argc, char* argv[])
{
printf( "2 + 3 = %d", add( , ) );
}
实验 -- 动态库
环境和实例与静态库一致。
动态库-libShared.dll
addFuncLib.cpp
#include ".\\addFuncLib.h"
int add(int x,int y)
{
return x + y;
}
addFuncLib.h
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x, int y);
#endif
应用 运行前,需要将ibShared.dll添加到此目标文件路径。
callAddFunc.cpp
#include <stdio.h>
#include <windows.h> typedef int(*lpAddFun)(int, int); //宏定义函数指针类型 int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll = LoadLibrary(".\\libShared.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(, );
printf("dll calling add func with arg 2 3 =%d", result);
}
FreeLibrary(hDll);
}
return ;
}
C语言中静态库和动态库笔记的更多相关文章
- (转)HelloWorld CMake CMake中构建静态库与动态库及其使用
		
继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...
 - linux中C的静态库和动态库分析
		
从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...
 - Python语言、编译解释、动态库静态库、编译过程、头文件
		
学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...
 - Makefile中静态库,动态库的创建和使用以及解压缩命令
		
应用层通过操作文件操控硬件 使用制作好的工具链: 刚开始学习时,用一些已经制作好的工具链,使用以下命令解压到gcc-3.4.5-glibc-2.3.6目录 cd /work/tools tar xjf ...
 - VS中Debug和Realease、及静态库和动态库的区别整理(转)
		
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
 - VS中Debug和Realease、及静态库和动态库的区别整理
		
一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码 ...
 - UNIX环境下用C语言写静态库与动态库
		
静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS ...
 - 在Linux中创建静态库和动态库
		
我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...
 - linux中创建静态库和动态库
		
1. 函数库有两种:静态库和动态库. 静态库在程序编译的时候会被连接到目标代码中,程序运行时将不再需要改静态库. 动态库中程序编译的时候并不会连接到目标代码中,而是在程序运行时才被载入,因此在程序运行 ...
 
随机推荐
- HRBUST 1326 循环找父节点神术
			
题意 给出一个图 给出a点到每个点的路径 最后经过的除这个点本身以外的点 现在把a点改为b点 让求出按上面那种方式 把除b之外的点对应的点列出 ...算了我描述题意得能力好差...这个锅还是给出题的吧 ...
 - 20. 求阶乘序列前N项和
			
求阶乘序列前N项和 #include <stdio.h> double fact(int n); int main() { int i, n; double item, sum; whil ...
 - PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别
			
[PHP 配置文件中与错误相关的选项 ] 选项 描述 error_reporting 设置错误报告的级别 display_errors 是否显示错误 log_errors 设置是否将错误信息记录到日志 ...
 - MySQL update语句和insert插入语句写法完全不一样啊,不要搞混
			
1.mysql update 语句: update user set name = 'xiaoming',age = 18 where uid = 3000; 更新记录时update操作也不需要写ta ...
 - HTML: xhtml和html的區別
			
XHTML 与 HTML 4.01 标准没有太多的不同. 另外,你应该马上使用小写字母编写HTML代码,同时绝不要养成忽略类似 </p> 标签的坏习惯. 最主要的不同: XHTML 元素必 ...
 - Calculate  its  MTBF   assuming 2000 FITS for each DRAM
			
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION A common unit of meas ...
 - P2882 Face The Right Way - USACO07MAR
			
这道题没有一个比较详细的题解,我来提供一份. 首先我们可以知道,反转区间的顺序对结果没有影响,而且一个区间如果翻转两次以上是没有意义的,所以,问题就变成了求哪些区间需要反转. 我们枚举k.对于每一个k ...
 - delphi动态数组指针问题
			
就一个button事件 procedure TForm1.btn7Click(Sender: TObject); Type TMyArr = array of array of array of In ...
 - MyBatis代码自动生成
			
MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生成器自动生成实 ...
 - java NIO ;mvn
			
http://ifeve.com/java-nio-scattergather/ mvn introduction(install,conf, proxy,plugin,samples) http:/ ...