最近突然想写一个跨平台的项目,发现首先第一个要解决的调用跨平台的库的问题,所以研究一把两个平台下的库的问题。本文主要讲述在Windows系统和Linux系统的两种操作系统中,如何来建立静态链接库与动态链接库。
      1.介绍
      1.1 为什么要使用库(静态链接库与动态链接库)?

      基于提高代码的重用性、可维护性、可测试性等包含但限于上述原因,软件设计一般就会就功能分类,形成模块化。库则是模块化开发的体现,它封装具有分类功能的代码,供其他模块来调用。
      1.2 什么是静态链接库与动态链接库?

      概念无法来严谨描述,但无论是在Windows系统还是在Linux系统中,思想基本一致。如果在程序中调用了静态链接库中的函数,则被调用的函数的代码(确切的说是编译后的二进制映像代码而不是源代码)需要嵌入到程序中去一起编译,与程序形成一个整体。很显然,调用静态链接库的程序文件大小要变大一些。在Windows系统中,其后缀名一般为.lib,在Linux系统中,其后缀名一般为.a。如果在程序中调用了动态链接库中的函数时,动态链接库只需要在内存中保存一份,供所有需要的程序来调用。在Windows系统中,其后缀名一般为.dll,在Linux系统中,其后缀名的格式一般为.so.x.x。本文来论述Windows系统中的dll文件时,只提一种Non-MFC DLL,即非MFC动态库,而不涉及另外两种(MFC Regular DLL与 MFC Extension DLL)
      一般来说,动态链接库使用的更广泛一些,所以重点关是动态链接库。

      2.Windows系统中的静态链接库与动态链接库

      2.1 Windows系统中的静态链接库
      通过创建一个简单的静态链接库,使用C语言,开发工具为Visual Studio 2010,操作系统为Windows 7.
      (1)创建一个空项目,命名为TestStaticLibProject,在项目属性中更改如下图红色标记的属性,如下图:

 

      (2)创建头文件static_lib.h和源文件static_lib.c,代码分别如下:

    (3)运行,则可得到TestStaticLibProject.lib,就是静态链接库。

 

 

 

2.2 Windows系统中的动态链接库
    通过创建一个简单的动态链接库,步骤如下:

(1)创建一个空项目,命名为TestDynamicLibProject,在项目中更改其输出,如下图:

创建头文件dynamic_lib.h和源文件dynamic_lib.c,代码分别如下:

      (2)从DLL导出函数有两种方法:

      1. 在导出函数中定义extern _declspec(dllexport) ,可以见头文件和源代码的方案一。顺便提一句,如果是C++,需要导出类,则在头文件中的类的声明中使用类似的格式,例如:class _declspec(dllexport) Point 。

      2. 创建模块定义文件(.DEF)并在建立DLL时使用.DEF文件。

      简单的描述一下如何创建.DEF文件
      (1)第一行必须使用关键字LIBRARY描述DLL的名字,举例:
      LIBRARY libcstl
      (2)第二行可以是EXPORTS关键字,一看就知道是要导出函数了。EXPORTS后面是“函数名称”和“导出函数的数字”(它是由“@”符号与数字构成),“导出函数的数字”如果省略则编译器会自动生成。举例导出三个函数如下:
    _type_register                          @1000
    _type_duplicate                         @1001
    _type_debug                             @1002

      (3)其他的:注释可以使用分号“;”来完成;VERSION关键字可以指定版本号,DESCRIPTION一句可以描述DLL的用途。

      (3)运行,则可得到TestDynamicLibProject.dll和TestDynamicLibProject.lib,就是动态链接库。

 

       这两个导出方法在某些场合各有各的用途,比如第一种就适合在VC项目中自己调用,第二种适合在跨平台中,或是跨语言中使用。

 


      2.3 测试项目

      以上创建了两个链接库,可以在项目中来使用。创建一个名为TestProject的空项目(Empty Project),然后引用上面的两个库,步骤如下:

    (1) 引用静态库:在下图的输入框输入静态库的名称。

      (2)引用动态库,除了在上面的图中动态库对应的lib的名称(它里面包含标识符),还需要如下图中填上动态链接库的所在目录:

 

 

      (3)调用库的项目代码如下,名称为main.c:

 

      提供该项目源代码下载,关于Linux的部分下次再写吧。

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐