如何使用vs将C++项目打包成一个dll

当我们用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即可

一个打包一个单独的文件,通常有两种方式:静态链接和动态链接。 静态链接是将库的机器代码编译到可执行文件中的过程,这样可执行文件就不再依赖于库的存在。这种方法可以减小可执行文件的大小,但是每次更新库的时候都需要重新编译可执行文件。 动态链接是将库的机器代码编译到一个单独的文件中,在运行时动态加载库。这种方法可以减小可执行文件的大小,并且可以在不重新编译可执行文件的情况下更新库。 以下是将库打包单独文件的具体步骤: 1. 编译库。如果你是从源代码编译库的话,需要使用适当的编译器和构建工具来生库的二进制文件。如果你是使用已经编译好的库,则可以跳过此步骤。 2. 静态链接。如果你选择静态链接库的话,可以使用编译器将库的机器代码链接到可执行文件中。例如,在Linux中,你可以使用gcc编译器的-l选项将库链接到可执行文件中。 3. 动态链接。如果你选择动态链接库的话,可以将库打包一个单独的文件,例如一个动态链接库(DLL)或共享对象文件(SO)。在Windows中,可以使用Visual Studio中的工具来生DLL文件。在Linux和Unix中,可以使用gcc编译器的-shared选项生SO文件。 4. 将库的文件复制到可执行文件所在的目录。在运行可执行文件时,系统会从该目录中加载库文件。 5. 在可执行文件中引入库。在编写可执行文件的代码中,需要包含库的头文件,并在编译时链接库文件。例如,在C++中,可以使用#include指令来包含头文件,在编译时使用-l选项链接库文件。 总之,将库打包单独文件的过程需要根据你使用的库和编译器来进行调整。在打包过程中,需要确保库的版本与你的应用程序所需的版本一致,并且需要遵循相应的编译和链接规则。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值