我正在使用一个我无法修改的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()函数。