2009-03-26 11 views
3

私はWindows 32ビットアプリケーションを64ビットに移植しようとしていますが、後で全部をLinuxに移植することにします。プリプロセッサを使用してLinux上で64ビットビルドを識別するにはどうすればよいですか?

このコードには、32ビット版のコードをコンパイルする機能は、コードの32ビットバージョンをコンパイルする能力が必要ですが、アプリケーションで使用できるメモリの量に依存するセクションが含まれています下位互換性のために保存してください。

Windowsでは、適切なバージョンのコードがコンパイルされるように、それぞれのコードセクションをプリプロセッサステートメントにラップするだけです。

問題が発生したので、残念ながら私は、Linuxプラットフォームでのプログラミングに非常に少数の経験を持っている:

どのように私はLinuxプラットフォーム上の64ビットビルドを識別できるのですか?

私はこれをチェックする可能性のある(コンパイラー固有でないことが望ましい)プリプロセッサ定義がありますか?

ありがとうございます! GCC Manualによるとビョルン

答えて

6

を試すことができます(32ビット)およびAMD64(AMD64/x86-64の/ための非Itaniumの64ビットのターゲットEM64T/Intel 64)、Linux(IntelおよびPGI)用に異なるコンパイラが必要な人は非常に少ないためです。

ビルドターゲットを制御するコンパイララインスイッチ(MakefileのCFLAGSに追加できます)-m64/-m32があります。条件付きのCコードについて

#if defined(__LP64__) || defined(_LP64) 
#define BUILD_64 1 
#endif 

又は

#include <limits.h> 
#if (__WORDSIZE == 64) 
#define BUILD_64 1 
#endif 

最初のものは、特定のGCCであるが、第1の移植であるが、私はできない、いくつかの奇妙な環境において正確でないかもしれませんのことを考える。

現在、両方ともIA-32/x86(x86-32)およびx86-64/amd64環境で正しく動作するはずです。私は彼らがかもしれないと思います。はIA-64(Itanium)でも動作します。

GCCデベロッパーズサミットのAndreas Jaeger氏の論文(Porting to 64-bit GNU/Linux Systems)(64ビットLinux環境について詳しく説明しています)も参照してください。

+6

100%移植可能な代替手段があります: '#if UINTPTR_MAX == 0xffffffff'(32bit)'#else'(64bitと仮定したり、他の可能性を試す)。 –

+0

具体的には、 'uintptr_t'はC99ではオプションです。しかし、* Linux *はこの型の存在を強制しているように見えますが、 'sizeof(void *)== sizeof(long)' –

5

\(および場合のみ) コンパイルがある場合、これらのマクロは、値が1で、定義されてい

__LP64__

_LP64

intとポインタの両方が64ビットとを使用するターゲットの場合intは32ビットを使用します。

これは、必要なものです。

また、あなたがIA32のために、最近のGNU GCCコンパイラを使用していると仮定すると、

#define __64BIT (__SIZEOF_POINTER__ == 8) 
+0

Solaris CCと同じですが、そうでない場合は_ILP32が定義されています。私はそれを見て時間をかけ、DrJokepuは私にそれを打ちました:-( –

+0

あなたはそれを見てみましょう - 実際のドキュメンテーションに言及する答え!:) +1。 –

関連する問題