2016-05-30 1 views
0

これは基本的にmingw ld cannot find some library which is exist in the search pathMinGW linker can't find MPICH2 librariesと同じ問題ですが、私はthere are heaps of posts on StackOverflow regarding the issue of static and dynamic linking with MinGWを認識していますが、トラブルシューティングの方法については何も見つかりませんでした。バックスラッシュを含むレスポンス@fileから引数を読み込むと、MSYSのfind(既存の静的)ライブラリからldを呼び出すことができないのはなぜですか?

私は、MSYS2シェル(git-bash.exe)のMinGW上で(g++を介して)巨大なリンカコマンドを使ってプロジェクトを構築しています。プロセスは、とりわけ、で失敗します。

/z/path/to/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lssl 

私はg++リンカコール(ldに渡される)に-Wl,--verboseを追加し、私は-L/z/path/to/libs/openssl/lib/mingw -lsslために見ることができます:

... 
attempt to open /z/path/to/libs/openssl/lib/mingw/libssl.a failed 
... 
/z/path/to/libs/openssl/lib/mingw/ssl.dll failed 
attempt to open /z/path/to/libs/openssl/lib/mingw\libssl.a failed 
... 

しかし、これは奇妙ですファイルが存在するためですか?

$ file /z/path/to/libs/openssl/lib/mingw/libssl.a 
/z/path/to/libs/openssl/lib/mingw/libssl.a: current ar archive 

(...同じマシン上に同じコンパイラでビルドされていますか?)変なふう

、一度バックスラッシュ...\libssl.aと、スラッシュ.../libssl.aで開こうとしたら、 - しかし、上記のように少なくとも第1の経路は、bashシェルでチェックアウト?

-l:libssl.aを指定しようとするとさらに悪化します。代わりに-L/z/path/to/libs/openssl/lib/mingw -Wl,-Bstatic -lsslを指定した場合はさらに悪化します。その後、オープンするすべての試みは、バックスラッシュである:

... 
attempt to open /z/path/to/scripts/other/build/openssl/build/mingw/lib\libssl.a failed 
attempt to open /z/path/to/libs/openssl/lib/mingw\libssl.a failed 
... 

それをすべてオフトップに、私はldを使用して、コマンドラインから手動でそれを見れば、それが発見された:?!

$ ld -L/z/path/to/libs/openssl/lib/mingw -lssl --verbose 
attempt to open Z:/path/to/libs/openssl/lib/mingw/libssl.dll.a failed 
attempt to open Z:/path/to/libs/openssl/lib/mingw/ssl.dll.a failed 
attempt to open Z:/path/to/libs/openssl/lib/mingw/libssl.a succeeded 

んなぜこのようなことが起きるのか誰もが知っていますし、どうすれば最終的にこれらのライブラリを見つけるためにldを得ることができますか?あるいは、どうすればトラブルシューティングができ、ldが開こうとしているパスにこれらのライブラリが見つからないのか理解できますか?


OK、これはバグかどうかわかりません。私の問題は、実際にファイルから引数を読み取っていることです(それ以外の場合はg++: Argument list too longとなります)。だから、それをシミュレートする: - 引数が@でを通じてファイルから読み込まれている場合が、非常に同じ引数は、コマンドラインで与え、その後、静的ライブラリの検索が成功している場合

$ echo " -Wl,--verbose -L/z/path/to/libs/openssl/lib/mingw -lssl -lcrypto " > tmcd3 

$ g++ @tcmd3 2>&1 | grep succeeded | grep ssl         
# nothing 

$ g++ `cat tcmd3` 2>&1 | grep succeeded | grep ssl 
attempt to open Z:/path/to/libs/openssl/lib/mingw/libssl.a succeeded 
attempt to open Z:/path/to/libs/openssl/lib/mingw/libcrypto.a succeeded 

を...それは、判明します-sign、静的ライブラリの参照に失敗しましたか?残念ながら、catであっても、まだ私はg++: Argument list too longを取得しているので、実際のプロジェクトでは使用できません...どうすればこの問題を解決できますか?

答えて

1

MSYSは、シェルで使用されるときに引数として特別なディレクトリの処理を行います。例えば、 /<drive_letter>/blablaを適切なWindowsスタイルパスに追加します。これは、Z:スタイルディレクトリルートを扱わないUnixプログラムに対応するためです。

ここからわかるように、MSYSはファイルからの文字列読み取りでこの解釈を実行していません。あなたがそれについて考えるとき、それは非常に論理的ですが、あなたが最初に経験したように、時には迷惑になることもあります。

短いストーリー:Unixスタイルのパスをコマンド引数付きのファイルに入れないでください。代わりに、 cygpath -w、これはMSYS2(Git for Windows 2+に付属するMSYSでなければなりません)で動作します。

0

[OK]を、いくつかのより多くの実験で、私は気づい:

  • -L/z/path/to/libs/openssl/lib/mingw、Unixのパス指定は、失敗する傾向がある - 私たちは、Windowsのドライブ文字で始まる除いて、同じことを指定した場合一方で、それは次のようになります。
  • -LZ:/path/to/libs/openssl/lib/mingw
  • 、その後、物事は仕事 - も引数から @アットマークを使用してファイル:

 

$ echo " -Wl,--verbose -LZ:/path/to/libs/openssl/lib/mingw -lssl -lcrypto " > tmcd3 
$ g++ @tcmd3 2>&1 | grep succeeded | grep ssl 
attempt to open Z:/path/to/libs/openssl/lib/mingw/libssl.a succeeded 
attempt to open Z:/path/to/libs/openssl/lib/mingw/libcrypto.a succeeded 

シェルはMSYS2/git-bash.exeなので、/z/...でシェルに完全なPOSIXパスを入力することは問題ありません。シェルはそれらを変換するので問題はありませんが、ファイル内で変換するものはありません。それらを指定するためにWindows/MingWの規約を使用する必要があります。

関連する問題