gcc — могу ли я назвать C ++ extern «C» функция в cpp из другого cpp?

Я работаю с классом 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.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]