1

cpp ファイル (.h ではない) 内から extern "C" 関数を宣言する、変更できない C++ クラスを使用しています。

別の cpp ファイルからその関数を呼び出すにはどうすればよいですか?

さらに複雑なことに、関数は「weak」属性で宣言されているため、上書きできます。私が実際にやろうとしているのは、関数をオーバーライドしている派生クラスから基本クラス関数を呼び出すのと同じように、強い関数からその弱い関数を呼び出すことです。

  • もっと -

ppl が詳細情報を求めているので、具体的に説明しましょう...

iOS アプリ用の Qt 5.5 プロジェクトを作成しています。アプリを上向きにロードすると Qt がクラッシュするバグを発見しました。スレッドを参照してください:アプリを上向きに起動すると Qt for iOS がロックします。(qiosscreen.mm アサーション)

私は Qt ソースからビルドしていません。箱から出して使っています。cpp ソースは表示されますが、実際に変更したり含めたりすることはできません。

静的クラスを使用して、問題が発生する前にそれを検出する方法を見つけました。実際の直し方がわからないので、アプリ起動時に黒画面になるだけでなく、せめてエラーメッセージを表示したい。

Qt iOS アプリは、クラス「qioseventdispatcher」を使用してロードします。cpp (変更もインクルードもできません) は、弱いメイン関数と、qtmn という別の弱い関数を宣言しています。このqtクラスが呼び出す「メイン」関数としてqtmnをオーバーライドすることを想定しています。ただし、「実際の」メインをオーバーライドして、qt の基礎となるレイヤーなしで独自のネイティブ アプリを作成することもできます。

エラーメッセージを表示する単純なネイティブアプリをロードするために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 によって呼び出される get に進みます。

main の「強力な」コピーと、qtmn() の強力なコピーを提供したいと考えています。main の私のコピーは、私のネイティブ アプリをロードするか、何らかの方法で qt の弱い main 関数を呼び出すことを決定します。これにより、標準の Qt for iOS の方法で qtmn() 関数が呼び出されます。

4

0 に答える 0