关于动态链接库的制作过程和使用方法这部分,看了不少网上相关的内容,都看的不是很懂,所以在这里写一篇文章给那些给我一样看不懂的小白参考一下,好了言归正传,
假设有两个C++项目A、B,并且都定义了很多的子函数,这些子函数之间调用关系复杂,如果B需要通过使用DLL库的方式调用A中的一个子函数(或者多个),怎么办?
这里介绍一下我的动态链接库制作目的,我的编程环境是MFC联合Halcon,需要将halcon程序导出成C++程序,然后制作成动态链接库,供我的MFC程序调用。
思路:新建一个C++空项目,配置好halcon的环境,将转换成C++的Halcon的程序放到新建项目中,在将函数封装成动态链接库.dll,配置到MFC程序中供主程序调用。
动态链接库的制作步骤:
一、首先建立一个c++程序,空的就可以,这里面我在项目A中定义了一个函数make_distance_detect_model ,其函数声明所在头文件和函数定义所在源文件分别为:
LineDetect.h
extern "C" __declspec(dllexport) void make_distance_detect_model (HObject ho_ModelImage, HTuple hv_WindowHandle);
LineDetect.cpp
extern "C" __declspec(dllexport) void make_distance_detect_model (HObject ho_ModelImage, HTuple hv_WindowHandle)
{
}
注:自己选择设不设置接口,如果MFC程序调用该函数之后,后面需要用到该函数里面的变量,那么就需要设置接口,如果接口特别多还可以采用定义结构的方式,用指针调用函数里面的变量,这个后边介绍。
二、上面定义完之后,将项目A的配置类型改为动态库(.dll),然后生成解决方案
输出窗口出现如下结果,代表生成动态链接库成功
动态链接库的调用:
一、首先,找到A项目中Debug目录下找到生成的库.dll,.lib文件,然后复制到B项目(MFC)的工程目录.vcxproj下(如B项目也是WIN32项目,则复制到其Debug目录下),这里主要介绍前者
复制到
二、切换到B项目,可以新建一个头文件,并在该头文件中指定导出库.lib的路径
#pragma comment(lib,"D://Visual Studio codes//LineDemo//LineDemo//LineDetect.lib") extern "C" __declspec(dllexport) void make_distance_detect_model (HObject ho_ModelImage, HTuple hv_WindowHandle);
致此,动态链接库的制作过程和使用方法。
这里记录一下我在配置过程中遇到的问题:
一、
问题:#error : WINDOWS.H already included. MFC apps must not #include <windows.h>
解决:因为我是将我的MFC程序中的类函数封装了,而封装之前我是类中和主程序共用一个CComboBox类型的控件的变量,所以在新建的A项目中需要包含该项目
注意上面的包含完之后虽然可以定义CComboBox类型变量,但会出现我说的错误,原因是#include "afxwin.h"和原程序都包含了<windows.h>,需要在预编译头文件stdafx.h文件中包含#include “afxwin.h”,说白了就是将包含文件换个位置