前言
之前对于dll的链接无非是抽象出来的公共方法,但是不知道的是,整个C++项目可以完整的打包成DLL文件,而且打包后然后新建项目在调用。
过程
打包环境:Visual Studio2019
步骤:打开Visual Studo2019,点击“文件”->“新建”->”项目”,选择“动态链接库”模板如下同,然后点击下一步,
在配置新项目栏目输入“项目名称”,选择“位置”,然后勾选中“将解决方案和项目放在同一目录中”,点击“创建”。
将解决方案中的pc.h文件编辑更改如下:#ifndef PCH_H
#define PCH_H
#include "framework.h"
#endif
#ifdef IMPORT_DLL
#else
#define IMPORT_DLL extern "C" _declspec(dllimport)
#endif
IMPORT_DLL int pch(); 将原来项目源代码中main.cpp文件里面的代码替换原本的“pch.cpp”文件,并include<pch,h>。
在Visual Studio2019中右击”解决方案”->”在文件资源管理器中打开文件夹”。
然后选择原来项目源代码中带.h的头文件,将其复制到打开的文件夹中,在复制完在选中复制后的带.h的头文件将其复制添加到解决方案的头文件(注意:此处要保证复制的文件在打开的文件夹位置中,而非原来的原项目源码位置)。
同理,选择原来项目源代码中带.cpp的头文件,将其复制到打开的文件夹中,在复制完在选中复制后的带.cpp的头文件将其复制添加到解决方案的源文件中。
操作完后,打开原来的pch.cpp文件,按住Ctrl键点击自定义include的头文件,如果弹出警告”在当前源文件的目录或生成系统路径中未找到文件*.h”时,请先点击确定关闭警告框。然后在解决方案的下一层目录(即以项目名为标志)处右击,点击“重新扫描解决方案”。再次测试时即解决这个警告。
最后”运行”,在本机中点击“本地Windows调试器”,若提示错误:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include”pch.h”,则点击Visual Studio2019中的“项目”->“项目名属性”->”C/C++”->”预编译头”,将右侧的预编译头由“使用(/Yu)”调换到“不使用预编译头”,然后点击“应用”->”确定”。
再次运行时即能正确运行,若输出显示” ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========”即为成功,此时会弹出错误框。”显示无法启动dll,dll不是有效的Win32应用程序。”,我们关闭即可,dll必须由其他程序调用。此时我们在项目目录中的Debug目录下找到生成的*.dll文件。
我们新建一个“控制台应用”程序,将默认带输出”Hello World!”的文件里面代码更改如下:#include <iostream>
#include "Windows.h"
int main()
{
HINSTANCE hDllInst;
hDllInst = LoadLibrary(L"case1_part1_dll.dll"); //换成自身的dll文件名
typedef int(*PLUSFUNC)(); //后边为参数,前面为返回值
PLUSFUNC plus_str = (PLUSFUNC)GetProcAddress(hDllInst, "pch"); //GetProcAddress为获取该函数的地址
std::cout << plus_str();
} 然后在Visual Studio2019中右击”解决方案”->”在文件资源管理器中打开文件夹”。将之前生成的*.dll文件夹复制此,并将原项目的资源文件复制到此,若有其他资源文件依次操作即可。
然后点击“本地Windows调试器”,可以发现程序正常运行启动。
后记
更多关于DLL打包的问题可以相互交流沟通。
|