VS生成C++动态链接库DLL

1、官方文档:

在 Visual Studio 中创建 C/C++ DLL | Microsoft Learn

演练:创建和使用自己的动态链接库 (C++) | Microsoft Learn

创建和调用步骤,主要按照第二篇操作

一、建立DLL项目生成库文件

直接建立C++的DLL项目,注意叙述:

如果“将解决方案和项目放在同一目录中”已选中,则取消选中。

这个不知道为什么。尝试选中也一样能最后生成.dll库文件,只不过目录不同。

VS生成DLL项目时,默认会生成一些头文件和源文件。文中,这些文件不用修改,只是需要再添加自己的头文件和源文件,在所有源文件中需要嵌入pch.h。

然后,需要非常注意的一点是:

在声明给外部的接口函数的头文件中,开头一段要写这一段代码:

#ifdef MATHLIBRARY_EXPORTS

#define MATHLIBRARY_API __declspec(dllexport)

#else

#define MATHLIBRARY_API __declspec(dllimport)

#endif

其中MATHLIBRARY_EXPORTS是这样来的:MATHLIBRARY是DLL工程名,后缀_EXPORTS表示要导出为库文件。这个名称,可以在建立了DLL项目后,在解决方案资源管理器中,右键工程--属性--配置属性--C/C++--预处理器--预处理器定义,选下拉,编辑,可以看到有这个后缀_EXPORTS的宏。

添加这段代码后,对于接口函数,需要在声明前面加上MATHLIBRARY_API这个宏,表示这些函数是库中对外的接口函数。

文中是:

extern "C" MATHLIBRARY_API void fibonacci_init(
    const unsigned long long a, const unsigned long long b);

// Produce the next value in the sequence.
// Returns true on success and updates current value and index;
// false on overflow, leaves current value and index unchanged.
extern "C" MATHLIBRARY_API bool fibonacci_next();

// Get the current value in the sequence.
extern "C" MATHLIBRARY_API unsigned long long fibonacci_current();

// Get the position of the current value in the sequence.
extern "C" MATHLIBRARY_API unsigned fibonacci_index();

还在宏前加了extern "C"。

然后就可以编译了,VS中直接右键工程名点生成。如果是整个解决方案只有这个工程,也可以点击生成解决方案。需要注意的是,如果有修改,最好每次生成时选重新生成,而不是生成,或者先清理,在生成,试验发现直接点生成,只会生成.dll文件,而不会生成.lib文件。生成解决方案也是一样。

二、建立其他工程调用DLL库

按照参考文章设置各种路径,最好是新建工程,将库文件拷贝到新建工程中某个目录下,头文件也拷贝到某个目录下,需要在新建的工程中导入这些头文件。不建议文中建议的将目录都定位到原DLL工程的文件目录。这样关联性强但是也容易失掉版本。且是对于一个人来处理的。如果DLL给另一个人,则很难关联到原始的DLL工程。

编译,即生成项目或者解决方案,应该就可以用了。

2、其他文章:

VS开发C++动态库及其调用程序_把visual studio exe改成动态库-CSDN博客

实例代码在这:

【免费】C++动态库创建和应用程序调用动态库的源码_把visualstudioexe改成动态库资源-CSDN文库

这个例子很好,是正规的C++代码生成DLL库文件,纯手工写的。其中对类和函数的对外接口都有定义宏。

貌似下下来后直接编译的话,一些路径设置可能有些问题。

3、其他文章:

VS2022中创建C++SDK库(dll动态库)并调用SDK库(dll动态库)_c++调用营销平台的sdk-CSDN博客

将下面代码中:

#ifdef DLL_CALCULATION
#define DLL_CALCULATION _declspec(dllexport)
#else
#define DLL_CALCULATION _declspec(dllimport)
#endif

第一个宏定义改为:DLL1_EXPORTS

这段代码的说明,本文中有解释。这是定义了一个对外接口的类。

其他,按照文中步骤执行,最终可以实现。

4、其他文章

vs studio生成dll并调用的实现示例_vs生成dll文件-CSDN博客

可以直接在pch.h文件中声明对外的接口函数(及变量、类型),而不需要再添加原来声明这些函数(及变量、类型)的头文件,


EXTERN_C _declspec(dllexport) int myAdd(int a, int b);
EXTERN_C _declspec(dllexport) int myMax(int a, int b);

注意声明前需要加一些预定义。

最后主函数文件,应该不需要嵌入Dll1.h。

没去试验了。应该没问题。

5、后期的一些发现

实践中发现一些问题和可以改进的地方,是这样。基本所有的教程在讲调用DLL时,都建议将DLL程序中包含接口函数的头文件直接拿到调用工程,但是,实际发现,这些头文件往往定义了很多DLL程序需要使用的变量和函数,而这些变量和函数对于调用程序是不需要知道的,甚至,把这些开放给调用程序可能还会造成重定义以及误操作的问题,因此,完全可以且应该将这些变量和函数删掉,只保留调用程序需要使用的类型、变量和函数,即,可以修改头文件。

此外,正如另一篇文章主题,当调用程序需要使用DLL中全局变量时,最好再通过函数封装下,即通过函数获取,而不是直接开放给调用程序原始变量,这样虽然繁琐,但是安全。

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中,可以使用动态链接库DLL)的方式实现代码模块的重用。下面是一个简单的例子,演示如何在 Windows 系统中创建一个简单的动态链接库: 首先,创建一个新的 C++ 项目,并在该项目中添加一个新的源文件。 将以下代码粘贴到新的源文件中: ``` #include <iostream> #include "example.h" using namespace std; __declspec(dllexport) int add(int a, int b) { return a + b; } __declspec(dllexport) int subtract(int a, int b) { return a - b; } ``` 其中,`__declspec(dllexport)` 用于指定该函数是动态链接库中可导出的函数。 然后,创建一个名为 `example.h` 的头文件,并在其中声明 `add()` 和 `subtract()` 函数: ``` #pragma once __declspec(dllexport) int add(int a, int b); __declspec(dllexport) int subtract(int a, int b); ``` 保存并编译代码,然后生成 DLL 文件。在 Visual Studio 中,可以通过选择“生成”菜单中的“生成解决方案”选项来生成 DLL 文件。 最后,在另一个项目中使用该 DLL 文件。在该项目中,需要包含 `example.h` 头文件,并链接到 DLL 库。这可以通过在 Visual Studio 中的“属性” -> “链接器” -> “输入”选项卡中设置来完成。 现在,可以在另一个源文件中使用 `add()` 和 `subtract()` 函数: ``` #include <iostream> #include "example.h" using namespace std; int main() { int a = 10, b = 5; cout << "a + b = " << add(a, b) << endl; cout << "a - b = " << subtract(a, b) << endl; return 0; } ``` 编译并运行该代码,将会输出以下内容: ``` a + b = 15 a - b = 5 ``` 这就是使用 C++ 创建动态链接库的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值