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( 2, 3 ) );
}

实验 -- 动态库

  环境和实例与静态库一致。

动态库-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(2, 3);
            printf("dll calling add func with arg 2 3 =%d", result);
        }
        FreeLibrary(hDll);
    }
    return 0;
}

C语言中静态库和动态库笔记

时间: 2024-12-07 10:39:33

C语言中静态库和动态库笔记的相关文章

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

继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). cd /home/ccj/CMakeDemo mkdir t3   cd /backup/cmake/t3 mkdir lib   在t3目录下建立CMakeLists.txt,内容如下: PRO

HelloWorld CMake Demo 03:CMake中构建静态库与动态库及其使用

? 继续完善Hello World,建立它的共享库, 包括静态库和动态库. ? 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). ? 一,准备工作: 在/home/ccj/CMakeDemo目录建立t3目录,用于存放本节涉及到的工程. cd /home/ccj/CMakeDemo mkdir t3 ? 二,建立共享库

iOS 中的静态库与动态库,区别、制作和使用

如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名. 静态库与动态库的区别 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝.动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内

Linux学习笔记7——linux中的静态库和动态库

一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用ar -r可以将文件归档成静态库,调用格式:ar -r 静态库文件 被归档的文件 例如:我们这有两个C文件,分别为test1.c和test2.c 首先我们将它编译成目标文件:gcc -c -static test1.c gcc -c -static test2.c 此时会产生两个文件,分别为test1

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

原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用. Debug 和 Release 的真正区别,在于一组编译选项. Debug 版本 参数 含义 /MDd /MLd 或 /MTd 使用 Debug ru

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

静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS 下的术语,但两者的概念是一样的.下面统一说静态库和动态库. 静态库,就是一大堆object (CC ,CC 在LINUX 下其实是软件链接到GCC 的,编译后默认为.o 结尾的)的集合.静态库就是用ar 等工具集合在一起.在编译的时候,连接器就会将这部分代码嵌入到目标代码里. 动态库,也是一大堆o

C语言函数篇(五)静态库和动态库的创建和使用

使用库函数是源码的一种保护?我猜的. 库函数其实不是新鲜的东西,我们一直都在用,比如C库. 我们执行pringf() 这个函数的时候,就是调用C库的函数. 下面记录静态库和动态库的生成和使用. 静态库:libxxx.a 动态库:libxxx.so 静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的时候不需要外部函数库 动态库: 在程序运行的时候,将库加载到程序中,运行的时候需要外部函数库 函数库的目录有 /lib 和 /usr/lib 和 自定义 头文件是库文件的辅助,头文件就像是目录

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

静态库和动态库的区别

real framework中不可以使用类别 或 不可以不包含类文件 real framework 中直接调用NSClassFromString函数会返回null  需要强制加载指定类 或 直接通过类名引用 linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见