cygwinでPyPyをコンパイルしようとしていますが、Pythonがgccでコンパイルされたばかりのファイル「externmod」を開こうとするとコンパイルが停止します。cygwinでのgccの問題は、コンパイルするものに自動的に「.exe」が追加されることです。そのため、gccがとして呼び出されてもgcc -shared -Wl,--enable-auto-image-base -pthread -o /tmp/usession-release-1.8/shared_cache/externmod
、出力ファイルはexternmod.exe
関係なく終了します。そのため、 Pythonは開こうとします/tmp/usession-release-1.8/shared_cache/externmod
が、それを見つけることができません。したがって、コンパイルは停止します。gccを再コンパイルする以外に、これを解決する方法を知っている人はいますか?やりたくない。
1096 次
3 に答える
4
かなりの数の変更を加えなければならなかった後、なんとかコンパイルできました。
- PyPy は Cygwin の構成を提供しません。上で提案したように、Linux 構成をコピーし、必要に応じて変更しました。特に、-pthread フラグを削除し、--export-dynamic C リンカー フラグを --export-all-symbols にする必要があります。ファイル拡張子 (.exe、.dll) もここで指定します。
- Cygwin は、POSIX 標準の GNU 拡張である tm 構造体に tm_gmtoff および tm_zone フィールドを実装していません。PyPy はこれらのフィールドを使用してタイム ゾーンを決定します。回避策を実装しました。これらの tm フィールドを使用すると、すべてを変更する必要のある複数のファイルが処理されます。
- Cygwin では、システム コールの waitpid() は、PyPy が使用するものとは異なるスロット 2 の引数タイプを想定しています。引数を再マップするラッパーを実装しました。
- Cygwin では、curses C ヘッダー ファイルは ncurses の下にあります。
cygwin のパッチと手順は、http: //www.tux.org/~mayer/cygwin/pypy にあります。
于 2012-04-30T22:53:01.640 に答える
3
あなたの質問に答えるために、あなたの問題を解決する最も簡単な方法は、pypy / translator /platformのinit.pyを変更して、現在取得している「なし」ではなく、実際のプラットフォームを指すようにすることです。linux.pyには、 `so_ext ='so''という行があることに気付くでしょう。これは、おそらく拡張機能の問題を修正するものです。
cygwinのふりをする小さなハックは、この正確なインスタンスではLinuxで機能しますが、後でいくつかの障害が発生することに注意してください(残念ながら、回避するのに十分な詳細を覚えているものはありません)。
編集:私のinit.pyの関連セクションは現在次のようになっています
if sys.platform == 'cygwin':
from pypy.translator.platform.linux import Linux, Linux64
import platform
if platform.architecture()[0] == '32bit':
host_factory = Linux
else:
host_factory = Linux64
elif sys.platform.startswith('linux'):
于 2012-04-23T16:59:42.127 に答える
1
Windowsは、実行可能であることを知るために「.exe」拡張子が必要です。Windowsを検索し、.exe拡張子を使用するには、ビルドを変更する必要があります。
于 2012-04-20T19:59:46.790 に答える