C++静态和动态链接库导出和使用

1、简介

代码开发过程中会遇到很多已有的函数库,这些函数库是现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态链接库和动态链接库。

动态链接库包含了函数所在的DLL文件和函数入口等相关信息,代码由运行时加载在进程空间中的DLL提供,显示调用不需要仅需要动态链接库的dll文件,无需头文件.h和动态链接库.lib文件,隐式调用则需要上述三种文件。
动态库特点:

  • 动态库把对一些库函数的链接载入推迟到程序运行时期。
  • 可以实现进程之间的资源共享。(因此动态库也称为共享库)
  • 将一些程序升级变得简单。
  • 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)

静态链接库包含了函数实现本身,在编译的时候直接将代码放入程序中。在调用静态链接库的时,需要使用静态链接库的头文件.h以及静态链接库的.lib文件。

静态库特点:

  • 静态库对函数库的链接是放在编译时期完成的
  • 程序在运行时与函数库再无瓜葛,移植方便。
  • 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件
  • 如果静态库进行更新则应用该库的所有程序都需要重新编译(全量更新)。

2、Windows动态链接库使用

2.1 动态链接库生成

首先新建工程MathLibrary_dll,在源文件中添加MathLibrary.cpp,在头文件中添加MathLibrary.h,具体代码如下:

  • 添加头文件MathLibrary.h如下:
#pragma once

#ifndef MATHLIBRARY
#define MATHLIBRARY

#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dellexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif // MATHLIBRARY_EXPORTS


namespace MathLibrary {
    
    

	class MATHLIBRARY_API Arithmetic
	{
    
    
	public:
		Arithmetic();
		~Arithmetic();
		// Returns a + b
		double Add(double a, double b);

		// Returns a - b
		double Subtract(double a, double b);

		// Returns a * b
		double Multiply(double a, double b);

		// Returns a / b
		double Divide(double a, double b);

	private:

	};
	extern "C" MATHLIBRARY_API double power(double a, double ratio);
}
#endif // !MATHLIBRARY
  • 添加源文件MathLibrary.cpp
// MathLibrary.cpp
// compile with: cl /c /EHsc MathLibrary.cpp
// post-build command: lib MathLibrary.obj

#include "MathLibrary.h"
#include<math.h>

namespace MathLibrary
{
    
    
    Arithmetic::~Arithmetic() {
    
    };
    Arithmetic::Arithmetic() {
    
    };

    double Arithmetic::Add(double a, double b)
    {
    
    
        return a + b;
    }

    double Arithmetic::Subtract(double a, double b)
    {
    
    
        return a - b;
    }

    double Arithmetic::Multiply(double a, double b)
    {
    
    
        return a * b;
    }

    double Arithmetic::Divide(double a, double b)
    {
    
    
        return a / b;
    }
    double power(double a, double ratio) {
    
    
        return pow(a, ratio);
    }
}
  • 生成动态链接库
    在项目的配置属性页选择配置类型为动态库(.dll)
    在这里插入图片描述
    生成的DLL文件如下所示:
    在这里插入图片描述

2.2 动态链接库使用

  • 新建测试动态链接库的项目MathLibrary_dll_test,并在源文件中添加一个测试代码如下所示:
#include <iostream>
#include "MathLibrary.h"
using namespace MathLibrary;

int main()
{
    
    
    double a = 7.0;
    int b = 99;
    double ratio = 2.0;
    Arithmetic *demo_class = new Arithmetic();
    std::cout <<"Add结果为= " << demo_class->Add(a, b) << std::endl;
    std::cout << "Multiply结果为= " << demo_class->Multiply(a, b) << std::endl;
    std::cout << "Divide结果为= " << demo_class->Divide(a, b) << std::endl;
    std::cout << "Subtract结果为= " << demo_class->Subtract(a, b) << std::endl;
    std::cout << "power结果为= " << power(a,ratio) << std::endl;
    delete demo_class;
    return 0;
}
  • 环境配置包括三步

1、属性页->C\C+±>附加包含目录,添加头文件目录
在这里插入图片描述
2、属性页->链接器->附加库目录中,添加lib文件目录
在这里插入图片描述
3、属性页->链接器->输入->附加依赖项,添加MathLibrary_dll.lib
在这里插入图片描述

  • 运行测试程序,结果正常显示如下:
    在这里插入图片描述

3、Windows静态链接库使用

3.1 静态链接库生成

首先新建工程MathLibrary,在源文件中添加MathLibrary.cpp,在头文件中添加MathLibrary.h,具体代码如下:

  • 添加头文件MathLibrary.h如下:
#pragma once

namespace MathLibrary {
    
    

	class Arithmetic
	{
    
    
	public:
		Arithmetic();
		~Arithmetic();
		// Returns a + b
		static double Add(double a, double b);

		// Returns a - b
		static double Subtract(double a, double b);

		// Returns a * b
		static double Multiply(double a, double b);

		// Returns a / b
		static double Divide(double a, double b);

	private:

	};
}
  • 添加源文件MathLibrary.cpp
#include "MathLibrary.h"

namespace MathLibrary
{
    
    
    Arithmetic::~Arithmetic() {
    
    };
    Arithmetic::Arithmetic() {
    
    };

    double Arithmetic::Add(double a, double b)
    {
    
    
        return a + b;
    }

    double Arithmetic::Subtract(double a, double b)
    {
    
    
        return a - b;
    }

    double Arithmetic::Multiply(double a, double b)
    {
    
    
        return a * b;
    }

    double Arithmetic::Divide(double a, double b)
    {
    
    
        return a / b;
    }
}
  • 设置属性页并生成静态链接库
    在这里插入图片描述
    生成的静态lib文件如下所示:
    在这里插入图片描述

3.2 静态链接库使用

  • 新建测试静态链接库的项目MathLibrary_test,并在源文件中添加一个测试代码test.cpp如下所示:
#include <iostream>
#include "MathLibrary.h"

int main()
{
    
    
    double a = 7.4;
    int b = 99;

    std::cout << "a + b = " <<
        MathLibrary::Arithmetic::Add(a, b) << std::endl;
    std::cout << "a - b = " <<
        MathLibrary::Arithmetic::Subtract(a, b) << std::endl;
    std::cout << "a * b = " <<
        MathLibrary::Arithmetic::Multiply(a, b) << std::endl;
    std::cout << "a / b = " <<
        MathLibrary::Arithmetic::Divide(a, b) << std::endl;

    return 0;
}
  • 环境配置
    在属性页->VC++目录->包含目录,添加头文件地址
    在属性页->VC++目录->库目录,添加库文件地址
    在这里插入图片描述
    在属性页->链接器->输入->附加依赖项,添加静态库lib名称MathLibrary.lib
    在这里插入图片描述
  • 运行测试程序,结果正常显示如下:
    在这里插入图片描述
    以上就是windows系统上使用visual studio 2019进行静态库和动态库的生成和使用说明,仅作记录。

参考:
https://blog.csdn.net/htt789/article/details/81454832
https://www.cnblogs.com/skynet/p/3372855.html
https://learn.microsoft.com/zh-cn/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=msvc-170
——END——

猜你喜欢

转载自blog.csdn.net/caobin_cumt/article/details/131398248
今日推荐