使用C ++,我正在尝试使用在我的主程序实例上声明的类与DLL一起使用。这是DLL中用于主程序的类的很多例子,但我还需要另一种方法。现在,一个简单的声明是可以的,但我的下一步将使用DLL上的主程序的静态类。
对于知识,我在Windows 10上使用MinGW 3.4.5。
举个例子,我试图生成3个文件:
源代码文件是:
class ON_MAIN tst_class {
public:
tst_class(char *);
~tst_class(void);
};
#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 %s\n", source);
}
tst_class::~tst_class(void)
{
printf("delete (tst_class *)\n");
}
#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;
}
#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 loaded\n");
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 dll\n");
}
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库,因为它不存在。
答案 0 :(得分:0)
你的定义不太对。 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
(例如,在基于Visual Studio的解决方案中,通常是stdafx.h)。