トホホな疑問(58) LD_LIBRARY_PATH設定したのにライブラリが見つからない?

Joseph Halfmoon

gccに-Lオプションあり。-lで指定するライブラリファイルのパスを示すためのオプションです。イチイチ設定するのはメンドイ。そこで環境変数 LD_LIBRARY_PATH があり。しかし環境変数で指定した筈なのにライブラリファイルを見つけてくれません。これはなぜ?MSYS2環境だから?結局、自分の設定ミスね、トホホ。

※「トホホな疑問」投稿順Indexはこちら

※MSYS2のMINGW64環境のgcc 13.2.0 で動作確認しています。

MSYS2上のOpenCLのインポートライブラリ

別シリーズの以下の記事でインテルGPUをOpenCLするための環境を整備しました。

やっつけな日常(53) 先達のお導き:WSL2とMSYS2からOpenCLを使用可とする。

その中でMSYS2上でOpenCLするのは、『koturnの日記』様の以下の記事のお陰で一撃でした。あざーす。

MSYS2でOpenCLを使う

この中で、Windows環境にデフォルトでインストール済の OpenCL.dll をMSYS2上の gcc で扱えるようにインポートライブラリ化してます。以下の2つのツールを使った荒業っす。

    • gendef
    • dlltool

gendefはパッケージ mingw-w64-tools 内のツールでDLLからの情報抽出を行うもの。dlltoolはパッケージ mingw-w64-binutils 内のツールで、いろいろ機能があるうち、今回は上記のgendefで抽出した情報からインポートライブラリを生成する機能で使われてました。

結果としてMSYS2(MINGW64)上でリンクできるライブラリ

libOpenCL.a

が出来あがり、このライブラリをリンクすることでOpenCLできるようになりました。

しかし、問題が一つ。

-L でライブラリの在処を直接指定するとビルドできるのだが LD_LIBRARY_PATHで在処を指定するとリンカがライブラリが見つからないとかエラーを吐くのです。

なぜ? 注意深い人(普通でも)はここまでの流れで既にその理由がお分かりかと。しかし、このボケ老人は気づかず。以下のような無駄な試行錯誤を行ってしまいました。

MINGW64 bashで苦闘

当然のように、.bashrc内で環境変数を設定しております。念のため確認すれば以下のように定義されております。

$ echo $LD_LIBRARY_PATH
/usr/local/lib

この状態で、以下のように-Lでパスを指定すればコンパイルは成功(まあ、警告メッセージ若干が出るのですが、それはOpenCLのサンプル側の問題みたいなので無視)

$ g++ -std=gnu++11 main.cpp -L/usr/local/lib -lOpenCL -o test

ところが、以下のように-L引数を端折ってしまうと(環境変数LD_LIBRARY_PATHが定義してあるのだからかまわんだろ~)通りませぬ。

$ g++ -std=gnu++11 main.cpp -lOpenCL -o test

エラーはこんな感じ。ライブラリが見つからんと。ERROR_ld

御存じのとおり、MSYS2は、Windowsの中のUnix的な環境で実行プログラムそのものはEXEです。絶対パス指定はWindows式フルパスである方が良いのかも知れんと先ばしって以下のように変えてみました。が、結果は変わりませぬ。

$ echo $LD_LIBRARY_PATH
/c/msys64/usr/local/lib

念のため、以下のように-Lで指定するパスの表現をウインドウズ式フルパスに変えてもビルドは成功します。

$ g++ -std=gnu++11 main.cpp -L/c/msys64/usr/local/lib -lOpenCL -o test2

ある意味、2通りのパス指定があっても何とかしてくれるMSYS2すごいです(たまに混乱するみたいだけど)、いずれも環境変数側の指定は無視?

CMDプロンプト側でも苦闘?

MSYS2内の各ツールは、Windows上で実行されているので、MSYS2のbashから呼び出さずともcmdプロンプトからでもパスさえ通っていれば呼び出せます。そこで cmd.exeを呼び出して以下のように環境変数定義した後、

SET LD_LIBRARY_PATH=/msys64/usr/local/lib

cmd.exe上で以下のコマンドラインを敢行。

$ g++ -std=gnu++11 main.cpp -lOpenCL -o test

やっぱダメです。環境変数効いてないよ。

実はスタティックライブラリじゃん

無駄なことをしばらくやった挙句、以下のことにようやく気付きました。

libOpenCL.a、”.a” ってことはスタティックライブラリだよね。

”.so” でも “.dll” でもなく、作成されていたOpenCLのインポートライブラリは “.a”だったです。つまり環境変数的には

    • LD_LIBRARY_PATHは、ダイナミック・リンク用のパス指定
    • LIBRARY_PATHは、スタティック・リンク用のパス指定

以下のように指定したらばEXPORT

問題なく、ビルドが通るようになりました。おおボケな自分、トホホ。。。

トホホな疑問(57) 複数 .ino ファイルに虚を突かれる。Arduino IDE へ戻る