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

时间:2015-11-05 12:43:20

标签: c++ class 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 %s\n", 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 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库,因为它不存在。

1 个答案:

答案 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)。

这是another answer that is related