0

例子

我有 2 两个文件一起编译:

  1. MyClass.h/cpp其中包含数据和函数成员;

  2. Main.cpp包含int main()并将加载从以下源编译的动态库;

==== 编译为dynamiclib.so=========

  1. 具有外部“C” functionOfDynamic(MyClass*)的dynamic.c

设想

在文件中main.cpp,我将加载 ( dopen(dynamic.so,....)) 一个动态库(从 编译而来dynamic.c),其中一个函数将被调用并传递一个MyClass指针。

我的问题:动态库中的函数可以调用成员函数MyClass吗?

动态的.c

#include "MyClass.h"

int SomeMethodWrapper(void *A){

     return static_cast<MyClass*>(A)->SomeMethod();  // got core dump
}

extern "C" int functionOfDynamic(void* A) {
    SomeMethodWrapper(A);
}

我得到了核心转储

注意:MyClass 对象是在加载“dynamiclib.so”之前创建的

========更新==============

各位

上面的代码应该没问题,我得到了核心转储,因为我写错了,对不起

4

1 回答 1

1

假设你有

MyClass.h/MyClass.cpp实施

class MyClass {
public:
     //...
     void Foo( void );
;

然后在 中创建您的实例Main.cpp,并在其中调用您的 DLL。

那么这在 DLL 端看起来如何呢?如果您将 DLL 编译为 call MyClass::Foo,并且还包含MyClass.cpp在您的 DLL 项目中(您必须这样做,否则它会出现未解决的外部编译错误),那么您实际上编译void Foo( void )了两次,这对我来说听起来像是一个问题。

相反,您应该使用接口声明:

IMyClass.h

struct IMyClass {
    virtual void Foo( void ) = 0;
}

并相应地在MyClass.h

class MyClass : public IMyClass;

这样您就可以Foo从 DLL 中调用(纯虚拟的)而无需实际实现该函数。无论使用 C 还是 C++,这都有效。希望这可以帮助。

于 2013-06-24T09:14:26.757 回答