使用C++创建动态库dll

概述

虽然最近临近期末考试,但是我还是抽了一些时间去搞C++,因为要在12月底之前写出一个本地文件搜索引擎,所以只能加紧学习啦!
动态库,全称动态链接库(Dynamic Link Library),关于这东西的介绍,详见MSDN-DLL,这里只说说怎么用最简洁的方式生成自己的dll文件。

环境

  • 此处默认使用visual studio 2017 community版本
  • windows 10 Pro 1703

步骤

至于怎么在visual studio 中新建工程,这个就不多说了吧,要是不会用VC++,出门别说自己是学C++的……
但是有一些需要说明的,在工程向导中,一定记得勾选如图所示的按钮,才方便创建一个简洁而且完全自定义的C++ dll

使用C++创建动态库dll_第1张图片
应用程序向导
  • 切记,一定要有导出符号,否则不方便其他语言(主要是C#)调用
  • 如果不勾选空项目,会默认生成dllmain.cpp和stdafx.h以及stdafx.cpp三个文件,而这三个文件基本上用不到……

新建工程完毕后,在头文件和源文件中分别添加要创建的文件,此处以HelloWorld.cpp和HelloWorld.h为例分析

代码分析

HelloWorld.h

#include  //系统库,用于确定运行平台版本
#include  //系统库,包含几乎所有windows API

//一些必须的宏定义
#ifdef HELLOWORLD_EXPORTS
#define HELLOWORLD_API __declspec(dllexport)
#else
#define HELLOWORLD_API __declspec(dllimport)
#endif

namespace HelloWorld
{
    class onScreen
    {
    public :
        static HELLOWORLD_API void Print(void);
        static static HELLOWORLD_API void Import(void);
    private:
    void am(void); //此函数未定义
    };
}
  1. 宏定义解释
  • dllName_EXPORTS 输出符号定义,需在应用程序向导处勾选导出符号,在本例中为HELLOWORLD_EXPORTS
  • dllName_API 定义API函数的入口,需要在外部调用的函数需加此声明
  • dllName_API为__declspec()的宏定义,若定义dllexport,则不需要.def文件声明函数接口;若为dllimport则需.def文件显式声明函数接口
  1. 关于static
  • 必须使用static,因为外部调用非静态成员函数是违反语言规则的;需要访问非静态成员需要首先初始化它,然后调用
  1. 可以不使用namespace,此处是采用的C++的写法

HelloWorld.cpp

// HelloWorld.cpp : 定义 DLL 应用程序的导出函数。
//

#include "HelloWorld.h"
#include 

using namespace std;
using namespace HelloWorld;

void onScreen::Print(void)
{
    cout << "Hello, VC++ Dll!" << endl;
}

void onScreen::Import(void)
{
    onScreen::Print();
}
  • 这段代码只是对HelloWorld.h中函数声明的定义,不需要太多解释
  • 到这里就可以启动生成了,会编译输出两个文件,.lib和.dll,如果需要在C++中调用,则需要lib文件进行编译,如果是在C#或者其他语言中调用,则仅需要dll文件即可
  • 下次聊聊在C++中的调用吧,顺道补上如何访问非静态成员的方法

你可能感兴趣的:(使用C++创建动态库dll)