库

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

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

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

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

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

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

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. 《Pro Git》笔记1:起步

    第一章 起步 1.关于版本控制 版本控制用于记录和追踪目录结构和文件内容变化,能够追溯过去的任何修改和变化,并恢复到任何历史状态. 版本控制系统可以按照发展过程分成以下几类: 目录备份.记录版本变化最 ...

  2. jquery click点击事件重复执行多次

    $("button[name^='privateBtn']").click(function(){ alert('demo'); //接触绑定.避免重复执行 $("but ...

  3. http UserAgent

    string uAgent = Request.ServerVariables["HTTP_USER_AGENT"].ToLower();  //获取客户端浏览器的请求 判断 是什 ...

  4. physical addressing virtual addressing 物理寻址 虚拟寻址

    Computer Systems A Programmer's Perspective Second Edition The main memory of a computer system is o ...

  5. 后台list 如何转换为json格式

    request.setCharacterEncoding("utf-8"); response.setCharacterEncoding( "UTF-8"); ...

  6. [转载]:Delphi xe7并行编程快速入门

    现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...

  7. Git学习笔记(持续更新)

    1.强制同步为远程的代码 远程仓库回退了commit的情况下(第2条描述之情况),强制同步远程的代码到本地 #更新远程最新的所有代码,但是不merge或者rebase git fetch --all ...

  8. 【转】C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装

    http://blog.csdn.net/sqldebug_fan/article/details/17557341 1.SocketAsyncEventArgs介绍 SocketAsyncEvent ...

  9. 【转】Unity 解析Json字符串

    http://blog.csdn.net/qq_15267341/article/details/52013190 LitJSON使用很简单,两个步骤: 1 将LitJSON.dll文件拖动到unit ...

  10. JS获取Cookie值

    function GetLoginCookie() { var userCookie = getCookie("mycookie"); var loginname = userCo ...