web-dev-qa-db-ja.com

MinGWとMSYSがコマンドラインで指定されたパス名を変更できないようにする方法

Windowsでは、CodeSourceryのクロスコンパイラスイートを使用して、ARM/Linux用のプログラムをクロスコンパイルしています。私はコマンドインタープリターとしてMinGW MSYSを使用していますが、多くの場合、パスとパス名を壊します。たとえば、プログラムをビルドするには、

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/myrpathmyprogram実行可能ファイルに逐語的に挿入しました-ARMコンパイル対象のLinuxターゲットは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(!)

この迷惑な行動を無効にする方法はありますか?

56
Ted Middleton

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

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

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

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

25
Gurjeet Singh

Windows Git MSysでMSYS_NO_PATHCONV=1または MSYS2MSYS2_ARG_CONV_EXCL="*"を設定してパス変換を抑制する is a way があります。

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

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
72
Igor Mukhin

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

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

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

5
ak2

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

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

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

0
Steven