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

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

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

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

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

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

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. [ZZ] HD7970GE vs GTX770

    AMD/NV烽烟再起!HD7970GE大战GTX770 泡泡网显卡频道7月8日 高端市场肩负展示厂商实力,树立品牌形象的任务,历来是兵家必争之地.从GTX680 VS HD7970,HD7970GE ...

  2. 代理和block反向传值

    代理传值: // SendViewController.h #import <UIKit/UIKit.h> @protocol SendInFor <NSObject> -(v ...

  3. 使用Xcode GPU Frame Caputre教程

    http://blog.manbolo.com/2012/11/20/using-xcode-opengl-es-frame-capture 这里是原文,因为它版本比较老和它demo的限制,所以也想写 ...

  4. xampp默认mysql密码设置,修改mysql的默认空密码

    xampp默认mysql密码设置,修改mysql的默认空密码 分类: xampp2012-09-12 11:24 30264人阅读 评论(5) 收藏 举报 mysqlphpmyadminauthent ...

  5. 如何删除docker images/containers

    docker images往往不知不觉就占满了硬盘空间,为了清理冗余的image,可采用以下方法: 1.进入root权限 sudo su 2.停止所有的container,这样才能够删除其中的imag ...

  6. CLI下另一种多进程实现方式----PCNTL

    有些时候,你需要对一些脚本进行优化,以期跑的更快,在更短的时间内完成任务.PCNTL是一个不错的选择,它可以fork多个进程,来协同完成一个任务,理论上完成的时间将会和进程数成反比. 不过,PCNTL ...

  7. coursera-miniproject stopwatch任务总结

    ---恢复内容开始--- 首先是miniproject的说明: combin text drawing in canvas with time to build digital stopwatch. ...

  8. Blender to XPS(blender 2.7x Internal materials)

    Things we are gonna need are Blender 2.7x www.blender.org/ XPS tools addon for Blender A model made ...

  9. Java Blocking Queue

    //Listing 8-1. The Blocking Queue Equivalent of Chapter 3’s PC Application import java.util.concurre ...

  10. [LeetCode]题解(python):091 Decode Ways

    题目来源 https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encod ...