将C++类从主程序导出到DLL

Export C++ class from main program to DLL

本文关键字:DLL 主程序 C++      更新时间:2023-10-16

使用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的解决方案中)

以下是另一个相关的答案。