2

クロスプラットフォームのGUIライブラリ(FLTK)を使用してGUIを作成していますが、Win32APIは使用していません。このプログラムをWindows、Linux、MacOSで実行したい。

クロスプラットフォームのジャンボジャンボがどのように機能するかはわかりませんが(私のアカウント名を見てください)、クロスプラットフォームであることがを意味するのかは理解していると思います。しかし、それは私の質問ではありません。

私の問題は、現在のエントリ関数が単にint main()であるということですが、このエントリ関数を使用すると、コンソールがポップアップします。コンソールは必要ないので、次のようにエントリ機能を作成できることを知っています。

int wWinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPWSTR nCmdLine, int nCmdShow)

そしてコンソールはありません。

このwWinMainエントリ関数を使用するにはWin32APIを使用する必要があるため(HINSTANCEとLPWSTRのため)、プログラムは他のOSと互換性がなくなるのではないかと心配しています。

だから私の質問は、wWinMain関数を使用した場合、私のプログラムはMacとLinux OSで動作しますか?そうでない場合は、コンソールを作成せず、すべてのOSで動作する機能を使用できますか?

最後に、おそらく私は、同じ.exeプログラムをどのOSでも動作させることができるかどうかについて完全に妄想していますが、それは実際には不可能です。これはそうですか?

4

3 に答える 3

1

* NIXシステムはデフォルトでターミナルウィンドウを生成するべきではないので、おそらくWindowsで何か特別なことをするだけで済みます。

WinMain関数をラップできる場合、つまり、その周りにガードを配置し、その内部で#define「実際の」関数として機能する別の関数を呼び出してから、他のプラットフォームからその関数を呼び出すことができれば、大きな問題はありません。mainmain

ただしwchar_t、ワイド文字( )はプラットフォームごとに異なり、UTF-8などのすべての文字列を内部に格納して変換することで、ワイド文字を必要とするプラットフォーム固有のAPI呼び出しを処理するため、可能な限りワイド文字()を使用しないことを強くお勧めします(たとえば、 MultiByteToWideCharを介して)API呼び出しを行う場合のみ。

基本的に、Windows以外のプラットフォームでは標準main機能を使用する必要があり、Windowsではを使用する必要がありますWinMain。それらの両方に、メイン関数がすべきことを処理して返す3番目の関数を呼び出させます。

また、Windows PEバイナリ(.exeファイル)はWindowsでのみ機能します。何をするかに関係なく、プラットフォームごとに個別にプログラムをコンパイルする必要があります。

于 2012-11-14T00:46:49.110 に答える
1

リンカーオプションを見てください。リンカは、プログラムの実行可能ファイルの種類を制御します。
複数のmain機能を持つこともオプションです。#ifdefは、各プラットフォームでどちらを使用するかを制御できます。

おそらく私は、同じ.exeプログラムを任意のOSで動作させることができることについて完全に妄想しています

これは不可能です

于 2012-11-14T00:47:27.357 に答える
1

これは古い質問ですが、見つけたばかりで便利だと思います。user308323のアドバイスに従って、これを思いつきました。これは、VisualStudioプロジェクトでプリプロセッサ定義としてWIN32を定義するとうまく機能します。

#ifdef WIN32
int wWinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPWSTR nCmdLine, int nCmdShow)
#endif
#ifndef WIN32
int main(int argc, char **argv)
#endif

{
    Model model;
    UIController controller(model);

    controller.run(NULL, NULL);
}

関数のシグネチャを変更しただけで、argc引数とargv引数としてnullを送信していることに注意してください。これはコマンドラインプログラムではないため、これらは必要ありません。

すべてのプラットフォームで同じ.exeを使用できるようにすることについては、それは不可能ですが、異なるプラットフォームで同じプログラムをコンパイルできる限り、それは問題ではありません。それがFLTKライブラリの目的です。

于 2017-12-12T18:08:16.800 に答える