1. ホーム
  2. gcc

[解決済み] MinGWとMSYSがコマンドラインから与えられたパス名を混乱させないようにする方法

2023-05-02 09:25:20

質問

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/myrpath の中にそのまま挿入して myprogram 私がコンパイルしている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(!)が表示されます。

この迷惑な動作をオフにすることができる何かアイデアがありますか?

どのように解決するのですか?

MSYS/MinGW がパスを翻訳するのを回避するための巧妙なトリックを発見したところです。

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

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

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