Можно ли вызвать функцию 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.

0 ответов

Другие вопросы по тегам