質問

C でクロスプラットフォーム アプリケーションを作成するときに最も留意すべき点は何ですか?対象となるプラットフォーム:32 ビット Intel ベースの PC、Mac、および Linux。私は特に、Jungle Disk の USB デスクトップ版にあるような多用途性を探しています ( http://www.jungledisk.com/desktop/download.aspx )

この種の開発のヒントと「落とし穴」は何ですか?

役に立ちましたか?

解決

私は、30 近くの異なる OS およびコンパイラに移植された ANSI C ネットワーク ライブラリを何年も維持しました。このライブラリには GUI コンポーネントがなかったので、作業が簡単になりました。最終的には、プラットフォーム間で一貫性のないルーチンを専用のソース ファイルに抽象化し、それらのソース ファイル内で必要に応じて #define を使用しました。これにより、プラットフォームごとに調整されたコードがライブラリの主要なビジネス ロジックから隔離されました。また、必要に応じてプラットフォームごとに簡単に変更できるように、typedef と独自の専用型を広範囲に使用しました。これにより、64 ビット プラットフォームへの移植がかなり簡単になりました。

GUI コンポーネントをお探しの場合は、WxWindows や Qt (どちらも C++ ライブラリ) などの GUI ツールキットを検討することをお勧めします。

他のヒント

新しいプラットフォームを追加すると指数関数的に増加する傾向があるため、プラットフォームに依存する #ifdef は避けるようにしてください。代わりに、ルートにプラットフォームに依存しないコード、「葉」にプラットフォームに依存するコードを含むツリーとしてソース ファイルを編成するようにしてください。このテーマに関する素晴らしい本がありますが、 マルチプラットフォームのコード管理. 。この本のサンプル コードは時代遅れに見えるかもしれませんが、この本で説明されているアイデアは依然として非常に重要です。

カイルの答えに加えて、私は強くお勧めします に対して Windows で Posix サブシステムを使用しようとしています。これは、Microsoft が機能シートのチェック ボックスで「Posix サポート」を主張できるように、絶対的な最低限のレベルまで実装されています。もしかしたら実際に使っている人がいるかもしれませんが、私は実際に使ったことはありません。

確かにクロスプラットフォームの C コードを書くことはできますが、プラットフォーム間の違いを認識し、テスト、テスト、テストを行う必要があるだけです。単体テストと CI (継続的インテグレーション) ソリューションは、プログラムがすべてのターゲット プラットフォームで動作することを確認するのに大いに役立ちます。

良いアプローチは、システムに依存するものを 1 つまたはせいぜい数個のモジュールに分離することです。そのモジュールからシステムに依存しないインターフェイスを提供します。次に、他のすべてをそのモジュールの上にビルドするので、コンパイル対象のシステムに依存しません。

できる限り POSIX で書くようにしてください。Mac と Linux は POSIX をネイティブでサポートしており、Windows には POSIX を実行できるシステムがあります (私の知る限り、実際に使用したことはありません)。アプリがグラフィカルな場合、Mac と Linux の両方が X11 ライブラリ (Linux はネイティブ、Mac は X11.app 経由) をサポートしており、X11 アプリを Windows 上で実行する方法は数多くあります。

ただし、真のマルチプラットフォーム展開を探している場合は、ほとんど、またはまったく変更せずに複数のシステムで同じプログラムを実行できる Java や Python などの言語に切り替える必要があります。

編集:アプリケーションをダウンロードしてファイルを見てみました。3 つのプラットフォームすべてのバイナリが 1 つのディレクトリにあるようです。設定を失わずにマシンからマシンに移動できるアプリを作成する方法に関心がある場合は、すべての構成を実行可能ファイルと同じディレクトリ内のファイルに書き込み、Windows レジストリを触ったり、ドット ディレクトリを作成したりしないでください。 Linux または Mac でプログラムを実行しているユーザーのホーム フォルダー。そして、クロスディストリビューション Linux バイナリを作成する限り、32 ビット POSIX/X11 がおそらく最も安全な選択肢となるでしょう。現在 Mac を使用しているため、JungleDisk が何を使用しているのかわかりません。

移植可能なライブラリはかなり少数存在しますが、これは私が過去に作業した例に過ぎません

1) glib と gtk+

2) リブカール

3) リバプル

これらはほぼすべてのプラットフォームをカバーしているため、非常に便利なツールです。

Posix は Unis では問題ありませんが、Windows ではそれほど優れているとは思えません。さらに、そこにはポータブル GUI 用のものがありません。

XVT には、15 年以上成熟しており、ネイティブ ウィンドウ ツールキットの上に位置するクロス プラットフォーム GUI C API があります。 WWW.XVT.COMを参照してください。

少なくとも LINUX、Windows、MAC をサポートしています。

また、私は、異なるプラットフォームのコードを ifdef ではなく異なるモジュール/ツリーに分離するという推奨事項にも賛成します。

また、プラットフォームの違いは何か、それらをどのように抽象化できるかを事前に確認することをお勧めします。例えば。これは OS 関連のものです (例:テキスト ファイル内の煩わしい CR、CRLF、LF)、またはハードウェアの問題。例えば。前述の posix 互換性は、次のことを妨げません。

int c;
fread(&c, sizeof(int), 1, file);

ただし、ハードウェア プラットフォームが異なると、内部メモリ レイアウトがまったく異なる (エンディアン性) 場合があるため、一部のターゲット プラットフォームでは変換関数を使用する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top