5

Cygwin / Mingw / lccを調べていて、自分の Windows (できれば cygwin の下) で perl ネイティブ C 拡張機能をコンパイルし、Solaris と HP unix でそれ以上大騒ぎせずに実行できるようにしたいのですが、これは可能ですか?

これはすべて、元の perl クロスプラットフォームの質問hereに由来します。

4

7 に答える 7

6

(これは非常に古い質問ですが、いくつかの有用な情報が欠けています - 私は個人的に Solaris (SPARC & x86)、AIX、HP-UX、および Linux (x86、x64) に対してこれを行いました。)

  • C++ をクロスコンパイルするのは、ストレートな C よりもはるかに困難です。

  • HP-UX 32 ビット PA-RISC は、ELF の代わりに SOM フォーマットを使用し、binutils が SOM をサポートしていない (おそらく今後もサポートしない) ため、サポートされていません。つまり、64 ビット PA-RISC のみをクロスコンパイルできます。(PA-RISC 2.0 チップが必要です。)

  • 可能であれば、cygwin の代わりに mingw を使用します。Cygwin では、多くのファイル アクセス許可の問題と、面倒な cygwin1.dll の依存関係が導入されています。ただし、可能であれば、Linux でビルドしてください。実行しているすべてのツールとスクリプトは、高速な操作が可能な環境向けに設計されているため、すべてがはるかに高速になりexecますstat。Windows + NTFS はその環境ではありません。

  • crosstools スクリプトから始めますが、これに多くの時間を費やす準備をしてください。

  • 最初に最新の gcc/binutuils を試してみてください。問題を解決できない場合は、古いパッケージに戻してみてください。たとえば、Power3 (AIX) の場合、gcc 4.x シリーズのクロス コンパイラは不適切なコードを生成しますが、3.x は問題ありません。

  • ネイティブ ライブラリとヘッダーをコピーするときは、実行する可能性が高い最も古いマシンからコピーしていることを確認してください。新しい libc をコピーすると、古い libc を使用しているマシンではコードが実行されなくなります。

  • ネイティブ ライブラリとヘッダーをコピーするときは、おそらく「tar -h」でシンボリック リンクを実際のファイルに変換する必要があります。Solaris では、必要な crt オブジェクト ファイルが /usr/lib の下ではなく、cc ディレクトリに埋め込まれていることにも注意してください。

于 2010-02-03T22:11:51.607 に答える
5

クロスコンパイラーは、セットアップして正しく動作させるのが非常に困難です。

クロスコンパイルを機能させるには、NetBSD(の人々)が膨大な量の作業を投入する必要があり、同じOSを実行していて、アーキテクチャが異なることを考慮してください。

少なくとも、他のOSからWindowsにすべてのヘッダーをコピーし、ターゲットOS /アーキテクチャ用のクロスコンパイラ、リンカーなどを入手する必要があります。

また、それは不可能かもしれません-perlおよび共有ライブラリは、Windowsではまったく利用できないネイティブ/非gccコンパイラでコンパイルされる可能性があります。

于 2009-02-23T22:59:18.517 に答える
3

クロスコンパイラを起動して動作させるのは非常に難しいというDouglasの意見に同意します。これは通常、最後の手段として選択します。ブート ストラップを行っている場合、または組み込みデバイス用のバイナリを作成している場合、多くの場合、クロス コンパイルが唯一の選択肢です。クロス コンパイルを検討する前に、Cygwin で独自の gcc をコンパイルすることに慣れている必要があります。クロス コンパイルするには、Windows で実行する gcc をビルドする必要がありますが、これにより実行プラットフォーム用のバイナリが作成されます。これを行うためのサンプル手順は、ここにあります。

おそらく、ルートを持っていないか、ターゲットプラットフォームでコンパイルできないため、クロスコンパイルしたいと考えています。たとえば、Redhat Linux を実行するホスティング プロバイダーがありました。Perl CGI スクリプトと関連モジュールを実行できましたが、ターゲット マシンでコンパイルできず、構築したライブラリは自分のディレクトリに存在する必要がありました。

これを解決するために、ターゲット プラットフォーム用にクロス コンパイルを試みることもできましたが、代わりに、Windows 上の VM 内に同様のホストをセットアップすることにしました。Cygwin 内から、VM に ssh し、ソースをコピーし、完全な構成/ビルドを実行するスクリプトを作成できます。最後のステップは、ホストしているシステムにバイナリ アーティファクトをデプロイすることでした。

Windows 上の VM 内で Solaris 10 と Open Solaris の両方を実行することに成功しました。残念ながら、VM の下で HPUX を実行するのは難しいかもしれません。

于 2009-05-28T23:44:50.520 に答える
2

「Grand Unified Builder」( http://lilypond.org/gub/およびhttp://valentin.villenave.info/The-LilyPond-Report-11 (セクション #4))を読んでみませんか?

どのように機能するのかはわかりませんが、GUB を使用すると、Lilypond 開発者は Linux ボックスで約 11 のプラットフォーム用にコンパイルできます。

于 2009-05-29T00:06:24.097 に答える
1

Windows でコンパイルしてから、Wine を使用して任意の *nix で実行します。ほとんどの場合、うまく機能します。

于 2009-02-24T14:04:18.620 に答える
-1

いいえ、これはバイナリレベルでは不可能です。さまざまなOSとCPUの間には、バイナリレベルで非常に多くの違いがあります。

しかし、できることは、C拡張ソースを互換性のあるものにして、さまざまなプラットフォームにコンパイルできるようにすることです。Cは「ポータブルアセンブリ言語」として設計されました。クロスプラットフォームのルーチンを使用している限り、通常は同じように機能します。特定のプラットフォームにバグが存在する可能性があるため、引き続きテストする必要があります。

于 2009-02-23T22:53:42.927 に答える
-2

これはできません...しかし、SolarisまたはHPでコードを再コンパイルするのはそれほど面倒ですか?

于 2009-02-23T22:55:21.690 に答える