Mac、Linux、および Windows でコンパイルしたいアプリを作成する場合、さまざまなオペレーティング システムに含める必要があるさまざまなライブラリを管理する最善の方法は何ですか。たとえば、glut opengl ツールキットを使用するには、オペレーティング システムごとに異なるインクルードが必要です。
8 に答える
あなたの質問は実際には1つに2つの質問です:
1)適切なプラットフォームに適切なインクルードファイルを含めるようにC ++コードを作成するにはどうすればよいですか?
2)さまざまなプラットフォームで動作するようにMakefileを作成するにはどうすればよいですか?
C ++コードの質問はすでに回答済みです。プラットフォーム固有の定義を見つけ、それらを使用して、使用しているプラットフォームを把握してください。
Automakeまたはsconsは非常に複雑であり、コードを幅広い対象者にリリースする場合にのみ、時間をかける価値があります。社内コードの場合、通常、プラットフォームごとのインクルードを含む「汎用」makefileで十分です。Windowsの場合、GNU Make for Windows(ここから入手可能、またはnmakeを使用して、すべてのプラットフォームに共通の構文のサブセットに制限する)を入手できます。
Sconsには、autotoolsが行うことの多くをそれほど複雑にすることなく実行する構成メカニズムがあり、かなり移植性があります(ただし、autotoolsほど移植性はありません)。
コンパイラーには、使用できるプリプロセッサー・シンボルのセットが必要です。たとえば、Linuxシステム上のgccの場合はlinux、VC++の場合は_WIN32です。もっと複雑なものが必要な場合は、autoconfを見てください。ただし、Unixベースのコードに最適です。
大規模なOpenSourceプロジェクトのいくつかがこれをどのように処理するかを確認することをお勧めします。Apache Xerces(の古いリリース)のAutoSense.hppを参照してください。
Perhaps this is a cop-out answer, but have you looked at how boost handles this? They build on quite a few platforms without autoconf, although they do have their own build system - bjam - that probably handles some of the same situations. They also do a nice auto-linking trick on windows that automatically selects the right version of libraries for linking depending on the version of the MSVC compiler. Based on your initial description, it sounds like just macro defs checking for various platforms/compilers might do the trick, but perhaps there is more to your problem that would prevent this.
ライブラリが異なるプラットフォームで同じ API を提供する場合、必要なすべての を含む「プロキシ」インクルード ファイルを作成します#ifdef
。その「プラットフォームに依存しない」インクルード ファイルは、多数の読みにくいプリプロセッサ コマンドで雑然とする代わりに、クライアント コードにインクルードされます。これらは、見苦しく雑然としたプラットフォームに依存しないインクルードに含まれます。
API がプラットフォーム間で異なる場合は、独自の抽象化を作成する必要があります。
私が取り組んできたいくつかのプロジェクトでは、Makefile をビルドする autoconf ベースの configure スクリプトを使用しているため、簡単な方法でソースからすべてをビルドできます。
./configure
make
make install