我可以从另一个cpp调用cpp中的C ++ extern“C”函数吗?

时间:2015-09-30 20:40:25

标签: c++ gcc extern weak

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

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

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

  • 更多 -

好吧让我们真正具体,因为人们要求更多信息...

我正在为iOS App创建一个Qt 5.5项目。我发现了一个错误,如果你正面加载应用程序,Qt会崩溃。见线程:Qt for iOS locks up when app is launched face up. (qiosscreen.mm assertion)

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

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

使用“qioseventdispatcher”类加载Qt iOS应用。 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调用。

我想提供一份“强大”的主副本,以及qtmn()的强大副本。我的main副本将决定加载我的原生应用程序,或以某种方式调用qt弱主函数,然后在标准Qt for iOS方式中调用我的qtmn()函数。

0 个答案:

没有答案