前回の続き。実行時のライブラリ参照パスが設定できなかったログ。
実行時のライブラリ参照パスが設定できなかった
-L
以前、-Lでライブラリ参照ディレクトリパスを設定できると知った。 しかし、実行時には参照してくれなかった。 仕方ないのであてずっぽうでシステム環境変数のPathにパスを追記すると動作した。
-Wl,rpath
今回、新たに-Wl,rpath
というオプションを知った。
-Wl,rpath
オプションは、実行時のライブラリ参照パスを設定するものである。参考。
ライブラリ参照オプション
オプション | 例 | コンパイル時参照 | 実行時参照 |
---|---|---|---|
-L |
-LC:/LibDir |
○ | × |
-rpath-link |
-rpath-link=C:/LibDir |
○ | × |
-Wl,rpath |
-Wl,rpath=C:/LibDir |
○ | ○ |
試してみた
ほしいのは実行時に参照できるもの。つまり-Wl,rpath
。
それを前回のMakefileで試したが、以下のようなエラーになった。
Makefile
program.exe: program.cc
g++ -DUNICODE -Wl,rpath="C:/MinGW_GET/msys/1.0/gtk3/bin" -Wl,rpath="C:/MinGW_GET/msys/1.0/gtkmm3/bin" -Wall -std=c++11 -s -O3 -o program.exe program.cc `pkg-config gtkmm-3.0 --cflags --libs` -mwindows
実行結果
g++ -DUNICODE -Wl,rpath="C:\MinGW_GET\msys\1.0\gtk3\bin" -Wl,rpath="C:\MinGW_GET
\msys\1.0\gtkmm3\bin" -Wall -std=c++11 -s -O3 -o program.exe program.cc `pkg-con
fig gtkmm-3.0 --cflags --libs` -mwindows
c:/mingw_get/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32/bin/ld.exe: cannot
find rpath=C:\MinGW_GET\msys\1.0\gtk3\bin: Invalid argument
c:/mingw_get/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32/bin/ld.exe: cannot
find rpath=C:\MinGW_GET\msys\1.0\gtkmm3\bin: Invalid argument
collect2.exe: エラー: ld はステータス 1 で終了しました
Makefile:2: recipe for target 'program.exe' failed
mingw32-make: *** [program.exe] Error 1
続行するには何かキーを押してください . . .
cannot find rpath=C:/.../bin: Invalid argument
とある。見つからないらしい。見つからないのはパス?それともrpathというパラメータ?
もちろんパスが実在するのはファイラで確認済みなのだが。
MinGWとWindowsの環境問題のひとつにファイルパス記法がある。
とりあえずパスの区切り文字を\
から/
にしてみる。
g++ -DUNICODE -Wl,rpath="C:/MinGW_GET/msys/1.0/gtk3/bin" -Wl,rpath="C:/MinGW_GET
/msys/1.0/gtkmm3/bin" -Wall -std=c++11 -s -O3 -o program.exe program.cc `pkg-con
fig gtkmm-3.0 --cflags --libs` -mwindows
c:/mingw_get/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32/bin/ld.exe: cannot
find rpath=C:/MinGW_GET/msys/1.0/gtk3/bin: Invalid argument
c:/mingw_get/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32/bin/ld.exe: cannot
find rpath=C:/MinGW_GET/msys/1.0/gtkmm3/bin: Invalid argument
collect2.exe: エラー: ld はステータス 1 で終了しました
Makefile:2: recipe for target 'program.exe' failed
mingw32-make: *** [program.exe] Error 1
続行するには何かキーを押してください . . .
同じエラー。他、以下のようなパス文字列パターンも試したが同様のcannot find ... : Invalid argument
エラーだった。
- /C:/.../bin
- /C:/.../bin/
- /C/.../bin/
方法が分からず断念。結局、システム環境変数のPathに追記することでコンパイルと実行が可能な状態。
前にやってた
すっかり忘れてたが前にやってたみたい。
http://ytyaru.hatenablog.com/entry/2016/10/10/100000
このときも環境変数で解決してる。なんとかならないのか…。
理想
使用ライブラリはプロジェクト単位で指定したい。
ライブラリのバージョン違いもあるのだから、それはプロジェクト単位で使い分けたい。
システム(OS)単位でライブラリのパスをいちいち指定していたらキリがない。 だから環境変数でなく、コンパイルオプションで制御したい。
所感
とりあえず今はそんなに込み入ったライブラリ事情ではないし、一旦あきらめる。