将C++类从主程序导出到DLL
Export C++ class from main program to DLL
使用C++,我试图使用在我的主程序实例上声明的类来在DLL上使用。在主程序中使用DLL中的一个类有很多例子,但我需要另一种方法。目前,一个简单的声明是可以的,但我的下一步将使用DLL上主程序中的静态类。
为了了解更多信息,我在Windows 10上使用MinGW 3.4.5。
举个例子,我试图生成3个文件:
- tst_class.lib
- tst_library.dll
- tst.exe
源代码文件是:
- tst_class.h
class ON_MAIN tst_class {
public:
tst_class(char *);
~tst_class(void);
};
- tst_class.c
#include <stdio.h>
#define ON_MAIN __declspec(dllexport)
#define ON_DLL __declspec(dllimport)
#include "tst_class.h"
tst_class::tst_class(char *source)
{
printf("new tst_class() from %sn", source);
}
tst_class::~tst_class(void)
{
printf("delete (tst_class *)n");
}
- tst_library.c
#include <windows.h>
#define ON_MAIN __declspec(dllimport)
#define ON_DLL __declspec(dllexport)
#include "tst_class.h"
ON_DLL void tst(void)
{
tst_class *t = new tst_class("library");
delete t;
}
- tst.c
#include <stdio.h>
#include <windows.h>
#define ON_MAIN __declspec(dllexport)
#define ON_DLL __declspec(dllimport)
#include "tst_class.h"
typedef void (__cdecl *f_pointer)(void);
int main(int argc, char **argv)
{
tst_class *t = new tst_class("main");
delete t;
HMODULE module = LoadLibrary("tst_library.dll");
if(module != NULL) {
printf("Dll loadedn");
void *function_pointer = (void *)GetProcAddress(module, "tst");
if(function_pointer != NULL) {
f_pointer function = (f_pointer)function_pointer;
function();
}
FreeLibrary(module);
} else {
printf("Can't load dlln");
}
return 0;
}
编译它们:
g++ -c tst_class.c -o tst_class.o
正常ar cr tst_class.lib tst_class.o
正常g++ tst_library.c tst_class.lib -o tst_library.dll -shared
错误
这里我得到了这个错误消息:
/ccpg0mO9.o:tst_library.c:(.text+0x5a):对'_imp___ZN9tst_classC1EPc'的未定义引用…/ccpg0mO9.o:tst_library.c:(.text+0xb4):未定义对"_imp___ZN9tst_classD1Ev"的引用
但接下来是最后一步。。。
g++ tst.c tst_class.lib -o tst.exe
正常
编译/链接库时我做错了什么?
可执行文件运行良好。没有加载cource的库,因为它不存在。
您的定义不太正确。declspec
的形式通常是
#if BUILDING_MYDLL
#define MYDLL_EXPORT __declspec(dllexport)
#else
#define MYDLL_EXPORT __declspec(dllimport)
#endif
对于类的定义
class MYDLL_EXPORT tst_class {
public:
tst_class(char *);
~tst_class(void);
};
然后,在构建和链接dll代码时,您可以使用BUILDING_MYDLL
的命令行定义(例如-D BUILDING_MYDLL
),或者在dll内部的头文件中定义BUILDING_MYDLL
(例如,在通常为stdafx.h的基于Visual Studio的解决方案中)
以下是另一个相关的答案。
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 将C++类从主程序导出到DLL
- DLL与主程序的通信
- 从运行时加载的Dll中调用主程序的方法
- 我的进程在主程序之前崩溃,由datamngr.dll