1

我正在使用一个我无法修改的 C++ 类,它在 cpp 文件(不是 .h)中声明了一个外部“C”函数。

如何从另一个 cpp 文件中调用该函数?

更复杂的是,该函数是用“弱”属性声明的,因此我可以覆盖它。我真正想做的是以类似于从重写函数的派生类调用基类函数的方式从我的强函数中调用该弱函数。

  • 更多的 -

好吧,让我们变得更加具体,因为人们要求更多信息......

我正在为 iOS 应用程序创建一个 Qt 5.5 项目。我发现了一个错误,如果您正面朝上加载应用程序,Qt 会崩溃。请参阅线程:当应用程序面朝上启动时,Qt for iOS 会锁定。(qiosscreen.mm 断言)

我不是从 Qt 源代码构建的。我开箱即用。我可以看到 cpp 源代码,但实际上无法修改或包含它。

我想出了一种使用静态类的方法来检测我的问题是否会在它发生之前发生。因为我实际上不知道如何修复它,所以我想至少显示一条错误消息,而不是让应用程序在启动时进入黑屏。

Qt iOS 应用程序使用“qioseventdispatcher”类加载。cpp(我无法更改或包含)声明了一个弱主函数和另一个名为 qtmn 的弱函数。您应该将 qtmn 覆盖为您的“主”函数 - 这个 qt 类调用它。但是,您也可以覆盖“真正的”主程序并创建自己的本机应用程序,而无需 qt 底层。

我想在 RUNTIME 确定(我现在可以在编译时执行此操作)是否要调用 qt 函数或我自己的函数来加载将显示错误消息的简单本机应用程序。

这是一些qt cpp:

    extern "C" int __attribute__((weak)) main(int argc, char *argv[])
    {
        @autoreleasepool {
  ...
            qEventDispatcherDebug() << "Running UIApplicationMain"; qIndent();
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([QIOSApplicationDelegate class]));
        }
    }

  ...

    // We define qtmn so that user_main_trampoline() will not cause
    // missing symbols in the case of hybrid applications that don't
    // use our main wrapper. Since the symbol is weak, it will not
    // get used or cause a clash in the normal Qt application usecase,
    // where we rename main to qtmn before linking.
    extern "C" int __attribute__((weak)) qtmn(int argc, char *argv[])
    {
        Q_UNUSED(argc);
        Q_UNUSED(argv);

        Q_UNREACHABLE();
    }

qtmn() 继续由 UIApplication 选择器 (void) applicationDidFinishLaunching 调用。

我想提供 main 的“强”副本和 qtmn() 的强副本。我的 main 副本将决定加载我的本机应用程序,或者以某种方式调用 qt weak main 函数,然后它将以标准的 Qt for iOS 方式调用我的 qtmn() 函数。

4

0 回答 0