【问题标题】:how to stop name mangling in Qt class?如何停止 Qt 类中的名称修改?
【发布时间】:2021-09-12 07:51:42
【问题描述】:

最终我的目标是编写一个 Qt 类(我的类继承自 QObject 并使用 Q_OBJECT 宏),然后从中构建一个 dll。然后在 python 中使用 ctype 来访问该 dll。

当我正常编写 dll 时,方法名称会被破坏,因此我无法直接使用它们。相反,我必须使用我不想使用的getattr(因为其他人可能需要使用 dll 而我不想让他们感到困惑)。

无论如何,我读到要停止名称混乱,我需要使用 extern "C"

到目前为止,我尝试了这些:

extern "C"
{
   class MyClass::public QObject
   {
       Q_OBJECT

   public:
       void SomeFunction(int Parameter);
   }
}

这个没有构建,因为在 Q_OBJECT 中使用了宏模板,我得到“模板不能被声明为具有 'C' 链接”错误。

我试过了:

extern "C" typedef void SomeFunction_t(int parameter);

class MyClass::public QObject
{
   Q_OBJECT

public:
   SomeFunction_t SomeFunction;
}

这个已编译但仍然SomeFunction 名称被损坏;

我也不能在方法声明之前直接使用extern "C",因为它在类内部。 那么我怎样才能防止这里的名称损坏呢?

【问题讨论】:

    标签: c++ qt dll ctypes calling-convention


    【解决方案1】:

    我会冒险猜测这可能会因为这个构造而失败:

    extern "C"
    {
      class I_AM_A_CPLUSPLUS_CONCEPT {};
    }
    

    无论如何,这是可以解决的,但需要重新考虑。要将类暴露给 C,您必须在这里跳过几个环节。

       // the C++
       class MyClass : public QObject
       {
           Q_OBJECT
    
       public:
           void SomeFunction(int Parameter);
       };
    
       extern "C" MyClass* MyClass_new() {
           return new MyClass;
       }
    
       extern "C" void MyClass_delete(MyClass* c) {
           delete c;
       }
    
       extern "C" void MyClass_SomeFunction(MyClass* c, int p) {
           c->SomeFunction(p);
       }
    
    

    'MyClass' 将被修改为 C++ 名称,并且实际上没有任何方法可以将“SomeFunction”公开为 MyClass 的成员,而不使用名称修改。

    上面示例中的 C-Name 修改只会暴露:

    MyClass_newMyClass_deleteMyClass_SomeFunction 作为符号名称。 (即没有函数参数类型、返回类型、调用约定、拥有类等......这是 C++ 名称修饰将添加的内容)

    只需将 MyClass 视为一个不透明的指针,C 代码应该对此感到满意。没有求助于 pybind/boost::python (这显然不能真正干净地使用 DLL!),实际上没有任何其他好的方法可以将 C++ 对象绑定到 c 代码.

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 2011-07-11
      • 1970-01-01
      • 2012-07-01
      • 2020-04-28
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      相关资源
      最近更新 更多