web-dev-qa-db-ja.com

クロスプラットフォーム開発のためのファイルの命名と一般的な構成

私はクロスプラットフォームのソケットライブラリを作成しており、pimplイディオムを使用して、ユーザーがライブラリのヘッダーを含めることで、オペレーティングシステム固有の問題について心配する必要がないようにします。

したがって、たとえばファイルportable.hppは次のようになります:

// forward declare pimpl
struct socketimpl;

class portable
{
public:

private:
    socketimpl *pimpl_;  // hide OS specific details
};

しかし、実装ファイルに名前を付けるにはどうすればよいですか。

ができた portablewin.cppportablelinux.cppなど.

次に、サポートされているさまざまなオペレーティングシステム用の特定のフォルダーがありますか?

このようなフォルダ構造:

/makefile
/include/
/src/unix/
/src/windows/

次に、サポートされているプラ​​ットフォームごとに特定のファイルなどを持つヘルパーのmakefileを含む標準のmakefileがあります。

次に、OSごとにOS固有のメイクファイルを使用しますか?

それが最善の計画ですか?または他のアイデアはありますか?

3
user619818

どちらの方法でも機能します。だからあなたが好きなものを選んで、それからそれを一貫して適用してください。

あなたがあなたの選択をするのを助けるためのいくつかの意見:

  • 異なるツールチェーン(WindowsのVisualStudio、Linuxのgccなど)を使用する場合は、異なるmakefileが必要になります。 POCOライブラリ はその良い例です:ダウンロードページのBuildingセクションにあるreadmeファイルを見てください。または、 CMake などのクロスプラットフォームのmakeを使用することもできます。
  • OS固有のヘッダーをコンパイル/インクルードしないために、条件付きコンパイルを使用する必要があります。次に、すべてのファイルをコンパイルし、ソースファイルで、どの部分をどのシステム用にコンパイルするかを指定できます(makefileのプリプロセッサシンボル定義によって制御されます)。一方、PIMPLを使用すると、メイクファイルでコンパイルするファイルを自由に選択することもできます。
  • また、プラットフォーム固有のファイルの数にも依存します。
    • ごくわずかな場合は、すべてのファイルがportablewin.cppportablelinux.cppであるplatformサブディレクトリを使用できます。
    • OSに依存するいくつかの関連ファイルがあるため、OSごとにサブディレクトリを作成することは理にかなっています(例:boostは asio の実装にこれを使用します; SDLも同じです)。
  • 可能であれば小文字のファイル名とディレクトリ名のみを使用してください。これは、OS固有のケースの(中)感度のために、頭痛の種を回避します
3
Christophe

1か所で決定を下します。

ファイルへのパスとファイルの名前の両方でOSを認識できるようにします。それは2つの場所で行われている決定です。

この決定がファイルを扱うものでどれほど目に見えるようになるかに注意してください。

1
candied_orange