静态库

简单来说静态库(static library)就是将一些函数和变量打包,可以直接在其他地方调用。与之对应的还有动态库(dynamic library)。两者相比:

静态库优点:只需保证在开发者的计算机有正确的库文件,在以二进制发布时不需考虑在用户的计算机上库文件是否存在及版本问题,可避免DLL地狱等问题。
静态库缺点:生成的可执行文件体积较大。当初正是为了避免此问题,才开发了动态库技术。

Linux系统中,静态库通常以libXXX.a的形式存在,在Windows系统中则是以XXX.lib文件存在。

在 Visual Studio 2019 中创建静态库项目

在本文中以《嗨翻C语言》第8章内容为基础。

有两个头部文件和源码文件
encrypt.h

void encrypt(char *message);

encrypt.c

#include "encrypt.h"
void encrypt(char* message)
{
    while (*message) {
        *message = *message ^ 31;
        message++;
    }
}

checksum.h

int checksum(char *message);

checksum.c

#include "checksum.h"
int checksum(char* message)
{
    int c = 0;
    while (*message) {
        c += c ^ (int)(*message);
        message++;
    }
    return c;
}

上面两个源码文件,一个是加密工具,一个是防篡改工具。以此为基础,创建一个Encrypt.lib静态库。

以下内容来源于演练:创建并使用静态库

  1. 打开 Visual Studio 2019 在菜单栏上,选择“文件”>“新建”>“项目”,打开“创建新项目”对话框
  2. 在对话框顶部,将“语言” 设置为“C++” ,将“平台” 设置为“Windows” ,并将“项目类型” 设置为“库”
  3. 从经过筛选的项目类型列表中,选择“Windows 桌面向导”,然后选择“下一步”
  4. 在“配置新项目”页面,在“项目名称”框中输入“EncryptLib”,以指定项目的名称 。 在“解决方案名称”框中输入“Encrypt” 。 选择“创建”按钮,打开“Windows 桌面项目”对话框
  5. 在“Windows 桌面项目”对话框的“应用程序类型”下,选择“静态库(.lib)”
  6. 在“其他选项”下,取消选中“预编译标头”复选框(如果已选中) 。 选中“空项目”框
  7. 选择“确定”,创建项目

向静态库添加头文件和源码

  1. 要为新库创建头文件,请右键单击打开“解决方案资源管理器”中的“EncryptLib”项目的快捷菜单,然后依次选择“添加” > “新建项”
  2. 在“添加新项”对话框中,选择“Visual C++” > “代码” 。 在中间窗格中,选择 “头文件(.h)” 。 为头文件指定名称(本例中为 encrypt.h),然后选择“添加”按钮 。 这将显示一个近乎空白的头文件
  3. 要为新类创建源文件,请在“解决方案资源管理器”中打开“EncryptLib”项目的快捷菜单,然后依次选择“添加” > “新建项”
  4. 在“添加新项”对话框的中心窗格中,选择“C++ 文件(.cpp)” 。 为源文件指定名称(本例中为 encrypt.c),然后选择“添加”按钮 。 将显示一个空白源文件

按此步骤添加encrypt.h encrypt.c checksum.h checksum.c文件,在菜单栏上依次选择“生成” > “生成解决方案” 。 该生成将创建一个可供其他程序使用的静态库 EncryptLib.lib

在 Visual Studio 2019 中创建引用静态库的 C 控制台应用

  1. 在“解决方案资源管理器”中,右键单击顶部节点“解决方案 Encrypt”,打开快捷菜单 。 选择“添加” > “新建项目”,打开“添加新项目”对话框
  2. 在对话框的顶部,将“项目类型”筛选器设置为“控制台”
  3. 从筛选的项目类型列表中,选择“控制台应用”,然后选择“下一步” 。 在下一页中,在“名称”框中输入“EncryptClient”,以指定项目的名称
  4. 选择“创建” 按钮创建客户端项目
  5. 创建控制台应用后,将为你创建一个空程序。 源文件的名称与你之前选择的名称相同。 在此示例中,命名为 encrypt_client.c

在应用中使用静态库的功能

  1. 打开“解决方案资源管理器”中“EncryptClient”项目的快捷菜单,然后选择“添加” > “引用”
  2. “添加引用” 对话框列出了可以引用的库。 “项目”选项卡列出当前解决方案中的项目及其引用的任何库 。 打开“项目”选项卡,选中“EncryptLib”复选框,然后选择“确定”按钮
  3. 若要引用头文件,必须修改包含的目录路径。 在“解决方案资源管理器”中,右键单击“EncryptClient”,打开快捷菜单 。 选择“属性”,打开“EncryptClient 属性页”对话框
  4. 在“EncryptClient 属性页”对话框中,将“配置”下拉列表设置为“所有配置” 。 将“平台”下拉列表设置为“所有平台”
  5. 选择“配置属性” > “C/C++” > “常规”属性页 。 在“附加包含目录”属性中,指定“EncryptLib”目录的路径,或浏览该目录

    1. 打开“附加包含目录”属性值下拉列表,然后选择“编辑”
    2. 在“附加包含目录”对话框中,双击文本框顶部 。 然后选择行末尾的省略号按钮 (…)
    3. 在“选择目录”对话框中,向上导航一级,然后选择“EncryptLib”目录 。 然后选择“选择文件夹”按钮,保存所做的选择
    4. 在“附加包含目录”对话框中,选择“确定”按钮
    5. 在“属性页”对话框中,选择“确定”按钮以保存对项目所做的更改

现在可以通过在代码中包含#include <encrypt.h>标头来使用此应用程序中的encrypt函数了

encrypt_client.c

#include <stdio.h>
#include "encrypt.h"
#include "checksum.h"

int main()
{
    char s[] = "Speak friend and enter";
    encrypt(s);
    printf("Encrypted to '%s'\n", s);
    printf("Checksum is %i\n", checksum(s));
    encrypt(s);
    printf("Decrypted back to '%s'\n", s);
    printf("Checksum is %i\n", checksum(s));
    return 0;
}

要生成可执行文件,请在菜单栏上选择“生成” > “生成解决方案”

运行应用

  1. 请确保已将“EncryptClient”选为默认项目 。 若要选择它,请右键单击打开“解决方案资源管理器”中“EncryptClient”的快捷菜单,然后选
    择“设置为启动项目”
  2. 要运行项目,请在菜单栏上选择“调试” > “开始执行(不调试)”

结果:

EncryptClient.png

本文改编自:https://docs.microsoft.com/zh-cn/cpp/build/walkthrough-creating-and-using-a-static-library-cpp?view=msvc-160

标签: none

评论已关闭