Я работаю с классом C ++, который НЕ МОГУТ изменить, который объявляет функцию extern «C» из файла cpp (не .h).
Как мне вызвать эту функцию из другого файла cpp?
Чтобы еще больше усложнить ситуацию, функция объявляется с атрибутом «слабый», и поэтому я могу перезаписать ее. На самом деле я пытаюсь вызвать эту слабую функцию из моей сильной функции аналогично вызову функции базового класса из производного класса, который переопределяет функцию.
Хорошо, давайте определимся по-настоящему, поскольку люди просят больше информации …
Я создаю проект Qt 5.5 для приложения для iOS. Я обнаружил ошибку, из-за которой Qt вылетает, если вы загружаете приложение лицом вверх. Смотрите тему: Qt для 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 решит загрузить свое нативное приложение или как-то вызвать функцию main слабого qt, которая затем вызовет мою функцию qtmn () в стандартном режиме Qt для iOS.
Задача ещё не решена.
Других решений пока нет …