2

Windows、Linux、および組み込みターゲット用に 1 つのプロジェクトをコンパイルする必要があります。ホストまたは組み込みターゲットで実行する場合、アプリケーションには動作の違いがあります。私の要件を要約すると、次の表になります。

   Target               Compiler      Behavior
   Windows              MSVC, gcc         A
   Host Linux           gcc               A
   Embedded Linux       cross pltf gcc    B

コンパイラと環境の違いを自動的に認識する Makefile を作成したいと考えています (パラメーター/定義を手動で渡す必要はありません)。Cソースファイルレベルの条件付きコンパイルだけで、このような問題を解決することはできますか?
私は今のところ automake を使っていません。

4

4 に答える 4

6

autotoolsは、この問題を解決するために作成されました。Makefile だけではこれを行うことはできません。

条件付きコンパイルに関しては、これらのコンパイラが定義する利用可能なマクロがいくつかあります (たとえば_MSC_VER、MSVC++_WIN32用、Windows 用、および__linux__Linux 用)。また、gcc はさまざまな CPU ターゲットを処理するためのアサーションを提供します。

Target         Compiler     Conditional
Windows        MSVC++       #ifdef _MSC_VER
Windows        gcc          #if defined(_WIN32) && defined(__GNUC__)
Linux          gcc          #if defined(__linux__) && defined(__GNUC__)
Platform (x86) gcc          #if #cpu(i386)
Platform (arm) gcc          #if #cpu(arm)

それはあなたの目的には十分なはずです。

于 2010-02-12T17:35:55.900 に答える
2

私の答えは次のとおりです。環境の違いによって異なります。

環境ごとに、gcc のプリプロセッサによって事前定義されたマクロのリストを生成します。あなたがする必要があるのは、空のファイルを作成しfoo.h、次のコマンドを実行することです:gcc -E -dM foo.h環境ごとに. 出力を環境ごとに異なるファイルにリダイレクトします。

次に、定義済みのマクロを比較して、条件に合うものを探します。あなたの質問では、組み込み環境が Windows およびホスト Linux プラットフォームとは異なる動作をすることを示しました。組み込み環境に別のチップ アーキテクチャを使用していると仮定すると、アーキテクチャを示すマクロが定義されているはずです。たとえば、私の 64 ビット Linux ボックスでは、__x86_64__が定義されています。

その情報を取得したら、そのマクロを条件値として使用します。

#ifdef MACRO_INDICATING_EMBEDDED
// Behavior B
#else
// Behavior A
#endif
于 2010-02-12T17:42:11.860 に答える
0

オペレーティング システムアーキテクチャ用に定義済みのマクロを組み合わせて試すことができます。おそらくこれも興味深い:コンパイラ ids .

より高度なビルド システムを使用したくない場合は、makefile 内でコマンド ライン引数を解析できます。簡単な例は.exe、Windows での実行可能ファイル名への追加です。このために、メイクファイル内にこのようなコードがあります

ifeq ($(target),win32)
    foo_binary := $(foo_binary).exe
endif

make.batを含むファイルを介してmakeを呼び出します

@make.exe target=win32 %*
于 2010-02-12T18:02:31.977 に答える
0

gcc が定義します

 __linux__

Linuxでコンパイルするとき。MSVC は似たようなものを定義しています - 私はどれを忘れましたが、ドキュメントが教えてくれると確信しています

しかし、実際には configure の使い方を学ぶ必要があります。それがその目的です。学ぶのは大変ですが、非常に便利です (automake、autoconf など)。

于 2010-02-12T17:33:45.417 に答える