3

Mac、Linux、および Windows でコンパイルしたいアプリを作成する場合、さまざまなオペレーティング システムに含める必要があるさまざまなライブラリを管理する最善の方法は何ですか。たとえば、glut opengl ツールキットを使用するには、オペレーティング システムごとに異なるインクルードが必要です。

4

8 に答える 8

2

あなたの質問は実際には1つに2つの質問です:

1)適切なプラットフォームに適切なインクルードファイルを含めるようにC ++コードを作成するにはどうすればよいですか?

2)さまざまなプラットフォームで動作するようにMakefileを作成するにはどうすればよいですか?

C ++コードの質問はすでに回答済みです。プラットフォーム固有の定義を見つけ、それらを使用して、使用しているプラ​​ットフォームを把握してください。

Automakeまたはsconsは非常に複雑であり、コードを幅広い対象者にリリースする場合にのみ、時間をかける価値があります。社内コードの場合、通常、プラットフォームごとのインクルードを含む「汎用」makefileで十分です。Windowsの場合、GNU Make for Windows(ここから入手可能、またはnmakeを使用して、すべてのプラットフォームに共通の構文のサブセットに制限する)を入手できます。

于 2008-09-22T19:35:54.720 に答える
1

ヘッダーファイルについて心配する必要がある場合は、プリプロセッサが必要なすべてを実行します。異なるソースファイル、場合によっては異なるライブラリを処理する場合は、それを処理するためのツールが必要になります。

いくつかのオプションが含まれます:

私の個人的なお気に入りはCMakeです。Autotoolsは、比較的簡単に壊れる多段階プロセスを使用しており、sconsは私には奇妙に感じます。Cmakeは、makefileに加えて、さまざまなIDEのプロジェクトファイルも生成します。

于 2008-09-22T18:37:09.307 に答える
1

マクロに関する良い記事があります。OS / COmpiler(上部に近い)に基づく条件付きコンパイルの使用方法の答えの1つ。

自動構成ツールの使用は、これに加えて優れた追加機能ですが、OSを明示的に検出する方が簡単な小規模なプロジェクトには必要ありませんが、多くの異なるタイプのOSで実行する必要がある大規模なプロジェクトにも必要です。Brananが言及した利用可能な自動構成ツールを探索する

于 2008-09-22T19:20:12.183 に答える
0

Sconsには、autotoolsが行うことの多くをそれほど複雑にすることなく実行する構成メカニズムがあり、かなり移植性があります(ただし、autotoolsほど移植性はありません)。

于 2008-09-22T18:22:16.410 に答える
0

コンパイラーには、使用できるプリプロセッサー・シンボルのセットが必要です。たとえば、Linuxシステム上のgccの場合はlinux、VC++の場合は_WIN32です。もっと複雑なものが必要な場合は、autoconfを見てください。ただし、Unixベースのコードに最適です。

大規模なOpenSourceプロジェクトのいくつかがこれをどのように処理するかを確認することをお勧めします。Apache Xerces(の古いリリース)のAutoSense.hppを参照してください。

于 2008-09-22T18:25:13.033 に答える
0

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.

于 2008-09-22T18:50:51.757 に答える
0

ライブラリが異なるプラットフォームで同じ API を提供する場合、必要なすべての を含む「プロキシ」インクルード ファイルを作成します#ifdef。その「プラットフォームに依存しない」インクルード ファイルは、多数の読みにくいプリプロセッサ コマンドで雑然とする代わりに、クライアント コードにインクルードされます。これらは、見苦しく雑然としたプラットフォームに依存しないインクルードに含まれます。

API がプラットフォーム間で異なる場合は、独自の抽象化を作成する必要があります。

于 2008-09-22T18:31:27.450 に答える
0

私が取り組んできたいくつかのプロジェクトでは、Makefile をビルドする autoconf ベースの configure スクリプトを使用しているため、簡単な方法でソースからすべてをビルドできます。

./configure
make
make install
于 2008-09-22T18:19:09.633 に答える