85

Windowsでは、CodeSourceryのクロスコンパイラスイートを使用して、ARM/Linux用のプログラムをクロスコンパイルしています。私はコマンドインタープリターとしてMinGWMSYSを使用していますが、パスとパス名が壊れることがよくあります。たとえば、プログラムを作成するには、

arm-none-linux-gnueabi-gcc.exe -Wall -g \
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \
    -Wl,-rpath=/usr/lib/myrpath \
    -I../targetsysroot/usr/include \
    myprogram.c -o myprogram

もちろん、実行可能ファイル/usr/lib/myrpathに逐語的に挿入したいmyprogramのですが、コンパイル対象のARMLinuxターゲットはMinGWまたはMSYSを使用していません。しかし、これが最終的にそれに入るものです:

...
0x0000000f (RPATH)            Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...

正確には私が望んでいたものではありません。cmd.exeコマンドラインでGCCを直接呼び出すと、実行可能ファイルで正しいrpathを取得します。MSYSコマンドラインでGCCを呼び出すと、マングルされたrpathが取得されます。cmd.exeコマンドラインからmakeで実行されるMakefileを使用してGCCを呼び出すと、マングルされたrpath(!)が表示されます。

この迷惑な動作をオフにする方法はありますか?

4

5 に答える 5

128

Windows Git MSysまたはMSYS2で設定することにより、パス変換を抑制する方法があります。MSYS_NO_PATHCONV=1MSYS2_ARG_CONV_EXCL="*"

または、コマンド自体の直前に割り当てを配置することで、そのコマンドに対して一時的にのみ変数を設定できます。

MSYS_NO_PATHCONV=1 arm-none-linux-gnueabi-gcc.exe -Wall -g \
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \
    -Wl,-rpath=/usr/lib/myrpath \
    -I../targetsysroot/usr/include \
    myprogram.c -o myprogram
于 2015-12-20T22:16:38.123 に答える
66

MSYS/MinGWがパスを変換しないようにするための巧妙なトリックを発見しました。

ダブルスラッシュを使用してパスを開始する場合、MSYSはパスをDOS形式に変換しません。したがって、OPの例では、-rpathスイッチは次のように指定する必要があります。

-Wl,-rpath=//usr/lib/myrpath

すべてのUnix/Linuxツールは、このような偽のスラッシュを問題なく処理しているようです。したがって、バイナリのrpathは// usr / ...で始まりますが、ローダーは正しいことを行うと思います。

于 2013-01-07T03:58:56.257 に答える
7

これをオフにする方法はないと思います。MSYSは古いCygwinバージョンのフォークであり、Windows統合の改善を目的としたいくつかの調整が加えられています。これにより、ネイティブWindowsプログラムを呼び出すときのPOSIXパスの自動変換が間違いなく最も重要になります。それに関する問題は、引数がパスであるか他の何かであるか、またはこの場合のように、それにもかかわらず実際には翻訳されるべきではないパスであるかどうかを常に判断できるとは限らないことです。翻訳は、一連のヒューリスティックによってガイドされます。

MSYSmakeの代わりにMinGWmakeを使用してみることができます(そうです、それらは別のものです)。これは、POSIXパスのサポートと変換がないmakeのネイティブWindowsビルドです。でインストールしmingw-get install mingw32-make、として呼び出しますmingw32-make

または、理想的にはツールチェーンのCygwinビルドでCygwinを試すことができます。

于 2011-08-31T05:07:29.727 に答える
5

実際、MinGW.orgによって提供された元のMSYSプロジェクトでは、 Posixパス変換を無効にする方法はありません

そのため、GitforWindowsフォークで導入されたフラグをサポートするmsys-coreランタイムの小さなフォークを作成ました。このようにして、 Git for Windowsのように、ただし元のMinGW/MSYSで環境変数を使用できます。MSYS_NO_PATHCONVMSYS_NO_PATHCONV

したがって、要約すると、このPosixパス変換を無効にするには:

于 2021-01-04T21:46:34.287 に答える
2

残念ながら、この例でスラッシュを2つ前に付けると、期待どおりに機能しません。

rsync -rvztn --delete --exclude="/application/logs/" ...

'rsync'で、最上位にある/ application / logsにあるファイルのみを除外するようにしたいので、先頭にスラッシュを付けます。スラッシュを2つ追加しても、このディレクトリは除外されません。精度の低いものに頼らなければなりません--exclude="application/logs/"

于 2015-12-19T05:12:20.503 に答える