当我们用C++写了一个项目后,我们可能会希望其他项目能够很方便地调用它并且能够供其他语言进行调用,因此,我们便需要将该项目打包成一个dll文件。
在我第一次尝试这样做的时候,也查阅很多资料,但大部分教程都是使用的一个很简单的例子来说明,而不是尝试将整个项目进行打包,我们在实际情况下很多时候是打包整个项目而不仅仅是打包单个文件(虽然现在明白了其实这并没有本质的区别,过程都基本是一样的,但作为一个初学者而言,他并不知道实际的过程是怎么样的,所以当他遇到了问题他会觉得这是因为我所按照的教程是教如何打包单个文件的,而不是教如何真正打包整个项目, 至少我当初是这样的)
因此,我现在打算将自己打包整个项目的过程记录下来,我所打包的这个项目其实挺大的,有很多文件,但是过程其实和打包单个文件的过程基本一样,也很简单(现在真不知道我自己当初怎么会搞个一天多都没解决),以此希望有更多的人不要像我当初一样总觉得打包整个项目比打包单个文件困难很多而到处翻阅资料,结果让自己的脑子一片浆糊。
1.首先,这是我所需要打包的整个项目,可以看到,它所包含的头文件和源文件还是很多的。
2.为了打包整个项目,我们需要再添加几个单独的文件;
我们在头文件项右键点击添加新建项,不妨将文件的名称取为dll.h
需要注意的是,我们不要使用它给出的默认位置,因为它的默认位置是整个项目所在的文件夹位置,而我们的程序一般都放在该文件夹下面的子目录src中,如果我们采用它给出的默认位置,那么会导致我们所新建的头文件无法导入我们其它已有的头文件。
所以我们应该将位置改为下面所示的位置:
3.同理,新建一个同名的源文件
4.在我们新建的文件中分别键入如下代码:
//dll.h
#ifndef DLL_H_
#define DLL_H_
extern "C" _declspec(dllexport) void start();
#endif
//dll.cpp
extern "C" _declspec(dllexport)void start()
{
}
这个void start()就是我们所定义的接口,我们后续就可以通过这个接口来起到调用该项目的作用,当然,我们还没有对该接口的功能进行实现。
5.接下来我们需要把main.cpp里的main函数的程序放到我们所定义的导出接口start()中(直接copy过去就行,当然,原本main函数的return 0就不用拷贝过去了),然后把所需要导入的头文件也要赋值过去。
就像这样:
还有一点需要注意的是我们之前读取的数据采用的是相对路径,但是这里我们要把它改为绝对路径,并且重定向输出文件(即是把所有原本用cout输出的数据全部写入c:\result\res_data_output.txt中)
6.在 项目 → 属性 → 常规 → 配置类型 中把原本的应用程序改为动态库
7.点击 生成 → 生成解决方案 即可
这里出现了一个 小小的插曲,就是我刚开始生成的时候出错了,具体原因就是使用freopen时需要添加#define _CRT_SECURE_NO_WARNINGS
成功后我们便可以在下面的文件中找到VRP.dll
其他注意事项:
1.
这里选择Debug模式生成dll后dll的运行速度很慢,所以我们应该选择Release模式
我们要根据情况选择是x86(32位)还是x64(64位),例如,我们我们要用java调用该dll,而我们的jdk是64位的,那么我们的dll也应该生成64位的
还有一点想要说明的是,我们根本没必要新建一个dll工程,然后把自己的工程文件复制过去,只要在自己的工程中稍加修改,然后把项目的配置类型改为dll即可