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

发布时间:2024年01月18日

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。

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

文章来源:https://blog.csdn.net/weixin_40194697/article/details/135655156
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。