静态链接库

Posted swust_wjy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态链接库相关的知识,希望对你有一定的参考价值。

静态链接库

原文地址:静态链接库

静态链接库介绍

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。

静态链接库与动态链接库的区别

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

lib库

“每一个lib文件就是若干函数(假设只有函数)的定义”
lib库有两种,一种是包含了函数所在DLL文件和文件中函数位置的信息,称为导出库;一种是包含函数代码本身,一般现有的DLL,用的是前一种库;以前在DOS下的TC/BC等,是后一种库。包含函数原型声明的,是头文件(.h)。

静态lib与动态lib

lib有静态lib和动态lib之分。
  静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。静态lib也即是静态链接库。
  动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持。动态lib也就是相当于动态链接库采用隐式链接方式使用的时候用到的lib文件。

范例

范例1


//Dll4.h文件
int add(int x, int y);
//Dll4.cpp文件
#include "Dll4.h"
int add(int a, int b)

    return a + b;
//测试程序
#include <stdio.h>
#pragma comment(lib,"Dll4.lib")
#include "Dll4.h"
int _tmain(int argc, _TCHAR* argv[])

    printf("%d\\n", add(5, 6));
    return 0;

//输出11

注意:要把Dll4.h文件和Dll4.lib文件放到测试程序代码目录下

范例2:在静态链接库中使用类


//Dll4.h
int add(int x, int y);
class Rectangle

public:
    int area;
    void calcArea(int x, int y);
;
//Dll4.cpp
#include "Dll4.h"
int add(int a, int b)

    return a + b;

void Rectangle::calcArea(int x, int y)

    area = x*y;
//测试程序
#include "stdafx.h"
#pragma comment(lib,"Dll4.lib")
#include "Dll4.h"
int _tmain(int argc, _TCHAR* argv[])

    printf("%d\\n", add(5, 6));
    Rectangle rt;
    rt.calcArea(2, 2);
    printf("%d\\n",rt.area );
    return 0;

//输出结果
11
4

这里我们可以看到,测试程序是可以访问在静态链接库中定义的访问方式为public 的属性的。
但是如果我们将area的访问方式改为private,那么测试程序将不能访问area

以上是关于静态链接库的主要内容,如果未能解决你的问题,请参考以下文章

静态链接库

动态链接及静态链接

dll和lib(包括静态链接库和与dll同时生成的lib)

gcc 编译使用动态链接库和静态链接库

opencv静态链接库cmake链接顺序问题

Linux动静态库打包