库,故名思议,是存放东西的地方,其中存放的东西可以被多个人公用。

程序中借用库的概念,描述将代码进行抽取,这种代码被大多数程序使用,

其过程具有一定的模块化、封装、抽象的特征。

  按照库的使用方式, 静态库 和 动态库。

不管怎样方式使用, 首先库的概念体现出代码逻辑上公共抽象。

  有篇博文,做了介绍, 并有例子, 本文纯粹学习,借鉴了其中的例子。

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语言中静态库和动态库笔记的更多相关文章

  1. (转)HelloWorld CMake CMake中构建静态库与动态库及其使用

    继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...

  2. linux中C的静态库和动态库分析

    从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...

  3. Python语言、编译解释、动态库静态库、编译过程、头文件

    学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...

  4. Makefile中静态库,动态库的创建和使用以及解压缩命令

    应用层通过操作文件操控硬件 使用制作好的工具链: 刚开始学习时,用一些已经制作好的工具链,使用以下命令解压到gcc-3.4.5-glibc-2.3.6目录 cd /work/tools tar xjf ...

  5. VS中Debug和Realease、及静态库和动态库的区别整理(转)

    原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...

  6. VS中Debug和Realease、及静态库和动态库的区别整理

    一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码 ...

  7. UNIX环境下用C语言写静态库与动态库

    静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS ...

  8. 在Linux中创建静态库和动态库

    我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...

  9. linux中创建静态库和动态库

    1. 函数库有两种:静态库和动态库. 静态库在程序编译的时候会被连接到目标代码中,程序运行时将不再需要改静态库. 动态库中程序编译的时候并不会连接到目标代码中,而是在程序运行时才被载入,因此在程序运行 ...

随机推荐

  1. HRBUST 1326 循环找父节点神术

    题意 给出一个图 给出a点到每个点的路径 最后经过的除这个点本身以外的点 现在把a点改为b点 让求出按上面那种方式 把除b之外的点对应的点列出 ...算了我描述题意得能力好差...这个锅还是给出题的吧 ...

  2. 20. 求阶乘序列前N项和

    求阶乘序列前N项和 #include <stdio.h> double fact(int n); int main() { int i, n; double item, sum; whil ...

  3. PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别

    [PHP 配置文件中与错误相关的选项 ] 选项 描述 error_reporting 设置错误报告的级别 display_errors 是否显示错误 log_errors 设置是否将错误信息记录到日志 ...

  4. MySQL update语句和insert插入语句写法完全不一样啊,不要搞混

    1.mysql update 语句: update user set name = 'xiaoming',age = 18 where uid = 3000; 更新记录时update操作也不需要写ta ...

  5. HTML: xhtml和html的區別

    XHTML 与 HTML 4.01 标准没有太多的不同. 另外,你应该马上使用小写字母编写HTML代码,同时绝不要养成忽略类似 </p> 标签的坏习惯. 最主要的不同: XHTML 元素必 ...

  6. Calculate its MTBF assuming 2000 FITS for each DRAM

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION A common unit of meas ...

  7. P2882 Face The Right Way - USACO07MAR

    这道题没有一个比较详细的题解,我来提供一份. 首先我们可以知道,反转区间的顺序对结果没有影响,而且一个区间如果翻转两次以上是没有意义的,所以,问题就变成了求哪些区间需要反转. 我们枚举k.对于每一个k ...

  8. delphi动态数组指针问题

    就一个button事件 procedure TForm1.btn7Click(Sender: TObject); Type TMyArr = array of array of array of In ...

  9. MyBatis代码自动生成

    MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生成器自动生成实 ...

  10. java NIO ;mvn

    http://ifeve.com/java-nio-scattergather/ mvn introduction(install,conf, proxy,plugin,samples) http:/ ...