出口C&x2B+;从主程序到DLL的类 C++,我尝试使用在主程序实例上声明的类与DLL一起使用。在主程序上使用DLL中的类有很多示例,但我需要另一种方法。现在,一个简单的声明是可以的,但我的下一步将使用DLL上主程序的静态类

出口C&x2B+;从主程序到DLL的类 C++,我尝试使用在主程序实例上声明的类与DLL一起使用。在主程序上使用DLL中的类有很多示例,但我需要另一种方法。现在,一个简单的声明是可以的,但我的下一步将使用DLL上主程序的静态类,c++,class,dll,C++,Class,Dll,就我所知,我正在Windows10上使用MingW3.4.5 例如,我尝试生成3个文件: tst_class.lib tst_library.dll tst.exe 源代码文件如下: 尖沙咀大学h班 主tst上的类{ 公众: tst_类(字符*); ~tst_类(无效); }; 尖沙咀大学丙级 #包括 #在主节点上定义declspec(dllexport) #在DLL上定义declspec(dllimport) #包括“tst_类h” tst_类::tst_类(字符*源) { pr

就我所知,我正在Windows10上使用MingW3.4.5

例如,我尝试生成3个文件:

  • tst_class.lib
  • tst_library.dll
  • tst.exe
源代码文件如下:

  • 尖沙咀大学h班
主tst上的类{ 公众: tst_类(字符*); ~tst_类(无效); };
  • 尖沙咀大学丙级
#包括
#在主节点上定义declspec(dllexport)
#在DLL上定义declspec(dllimport)
#包括“tst_类h”
tst_类::tst_类(字符*源)
{
printf(“来自%s\n的新tst_类()”,来源);
}
tst_类::~tst_类(无效)
{
printf(“删除(tst_类*)\n”);
}
  • 尖沙咀大学图书馆
#包括
#在主菜单上定义declspec(dllimport)
#在DLL上定义declspec(dllexport)
#包括“tst_类h”
ON_DLL void tst(void)
{
tst_类*t=新的tst_类(“库”);
删除t;
}
  • tst.c
#包括
#包括
#在主节点上定义declspec(dllexport)
#在DLL上定义declspec(dllimport)
#包括“tst_类h”
typedef void(uu cdecl*f_指针)(void);
int main(int argc,字符**argv)
{
tst_类*t=新的tst_类(“主”);
删除t;
HMODULE module=LoadLibrary(“tst_library.dll”);
如果(模块!=NULL){
printf(“加载了Dll\n”);
void*函数指针=(void*)GetProcAddress(模块,“tst”);
if(函数_指针!=NULL){
f_指针函数=(f_指针)函数_指针;
函数();
}
免费图书馆(模块);
}否则{
printf(“无法加载dll\n”);
}
返回0;
}
要编辑它们:

  • g++-c tst_class.c-o tst_class.o
    OK
  • ar cr tst_class.lib tst_class.o
    OK
  • g++tst_library.c tst_class.lib-o tst_library.dll-shared
    错误
这里我得到了一条错误信息:

…/ccpg0mO9.o:tst_library.c:(.text+0x5a):对“\u imp_uuuuuuuzn9tst_classC1EPc”的未定义引用 …/ccpg0mO9.o:tst_library.c:(.text+0xb4):对“\u imp_uuuuuuuuzn9tst_classD1Ev”的未定义引用

但接下来的最后一步

  • g++tst.c tst_class.lib-o tst.exe
    OK
编译/链接库时我做错了什么


可执行文件运行良好。没有加载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\u MYDLL
(例如
-D building\u MYDLL
)或在dll内部的头文件中定义
building\u MYDLL
(例如,在通常是stdafx.h的基于Visual Studio的解决方案中)


这是。

好的。我知道了。我的
未定义引用的问题消失了。现在我可以做更多的测试,但我发现:类代码在.lib文件中。我想要的是类代码在主程序中,对于新版本,DLL将使用新的类源代码。很好,我很高兴它能工作。这听起来像是个新问题。用代码示例、预期结果等写出来,并将其作为一个新问题发布。我将提出另一个问题。但解决方案仅适用于
未定义的引用
。主要问题是:在DLL上使用主程序中的类(代码)。探索纯虚拟基类作为接口。您可能需要将它们转移到第三个dll中,该dll将与当前dll和exe共享。