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。
没去试验了。应该没问题。