2012-04-28 5 views
3

私は、POSIX APIとLinuxを使ったCプログラムを書いています。 友人のMac OSX PCでコンパイルして実行しましたが、小さなエラーがありましたが、Linux固有の機能は使用しませんでした。POSIXの互換性をテストするには?

LinuxがAPIに追加するいくつかの特定の機能を使用します。また、Mac OS XとFreeBSDには特定のPOSIX拡張機能を使用します。
条件付きコンパイルを使用してコードを選択します。 OSにそれらのどれもないなら、私は汎用のPOSIXコードを使用します。

私はDarwin/Mac OSXとFreeBSDを所有していません。私のPCにはLinuxだけがあります。私はFreeBSDをダウンロードしてインストールすることができません。なぜなら、それは500 MB以上であるからです。
プログラムがコンパイルされ、他のPOSIXシステムで期待どおりに動作するかどうかをテストする方法を知りたい。
テストを行うためのPOSIXシミュレータとコンパイラがあるのだろうかと思います。
テストは簡単です、彼らはGUIとドライバを使用しない、彼らはコマンドラインです。

FreeBSD、Mac OSX/Darwin、Generic POSIXの3つのテストが必要ですが、ツールはありません。

EDIT

GUIなしでFreeBSDとダーウィンの最小限のバージョンがあるが、GCC/G ++とssh/scpコマンドで?ダーウィンは自由ですね。
私のPCは古いですが、私はそれらを仮想マシンにインストールし、仮想ネットワークを作成し、ssh/scpを使ってプログラムを転送してテストできると思います。

+6

これは面倒なことですが、 'ポータブルコードはありません。 「移植されたコードのみ」テストするシステムの代わりに使用することはできません。それができない場合は、標準のサブセットをコード化して、異なるシステムに依存する必要があります。条件付きコンパイルを避けるのが最善です。あなたがそれを使用しなければならない場合、それは人生を複雑にします。 –

+1

@ジョナサン:それは、ある程度は真実ですが、過去5〜10年の間に、人々が "奇妙なシステム"への "移植性"のためにした伝統的なことの多くが今のようになりました古きよき古道のように。私は両側で議論が行われることに同意しますが、規格に準拠していない場合、壊れた実装を修正するために標準にコーディングし実装者を嫌うと思うのは、将来に向けて先を進める方法として多くのメリットがあります。私たちは "すべての目標へのポート"ゲームをプレイする必要はありません。 –

+2

また、大きな選手が乗っているときには、より多くの成功を収めています。反対側からは、GCCの多くのUB(署名されたオーバーフローやエイリアス違反など)のクラッキングは、最初は何かを壊してしまったが、プログラマーに壊れたプログラムを修正させるようになってきた。同様に、ビッグネームのアプリケーションによるアプリケーション側からの大胆なアクションは、大きな影響を与える可能性があります。ところで、このアプローチを取っても、必ずしも人気のある壊れたプラットフォームでプログラムが実行されるわけではありません。標準化されたコードをそこで実行させるためには、フィックス/グルーレイヤーを用意する必要があります。 –

答えて

5

簡単な方法の1つは、適切な機能テストマクロを使用してプログラムをコンパイルすることです。たとえば、POSIXのターゲットバージョン(現在は200809L)に_POSIX_C_SOURCEを定義した場合、POSIXベースで必要とされているものを除いて、あなたのプログラムにシステムヘッダを公開することを要求します。これはコマンドラインCFLAGSで-D_POSIX_C_SOURCE=200809Lで行うことができます。 XSIオプション(POSIXベースのスーパーセットである完全な単一UNIX標準機能)を使用する場合は、代わりに-D_XOPEN_SOURCE=700を使用してください。

これは、POSIX機能が不足している特定のシステム(たとえば、OSXが壊れていて、最後にチェックしたsem_initのPOSIXでは必須)でも、または依存するコード(たとえば、regcompに渡す式でGNU regex拡張を使用する)POSIX標準インタフェースの非標準動作では、標準でないインタフェースの偶発的な使用をキャッチするのに役立ちます。

+0

OS Xに関して - http://stackoverflow.com/questions/1413785/sem-init-on-os-x。コンパイルしますが、名前のないセマフォにはエラーが返されます。 – dsolimano

+0

リンクをありがとう。 POSIXが提供する最も有用な同期ツール(特にシグナルハンドラからの使用可能性)の1つであるため、これは本当に残念ですが、名前付きセマフォはかなりclunkyで、グローバルな名前空間を汚染してしまいます。予期せず終了する... –

1

他のシステム用にコンパイルする場合は、通常、別のシステムを持つ必要はありません。適切なcross compilerが必要です。

関連する問題