読者です 読者をやめる 読者になる 読者になる

やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

g++で実行時のライブラリ参照パスが設定できなかった

前回の続き。実行時のライブラリ参照パスが設定できなかったログ。

実行時のライブラリ参照パスが設定できなかった

-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というパラメータ? もちろんパスが実在するのはファイラで確認済みなのだが。

MinGWWindowsの環境問題のひとつにファイルパス記法がある。 とりあえずパスの区切り文字を\から/にしてみる。

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)単位でライブラリのパスをいちいち指定していたらキリがない。 だから環境変数でなく、コンパイルオプションで制御したい。

  • 環境変数が汚れずに済む
  • そのプロジェクトが依存するライブラリをMakefileにパスとして明記できるからわかりやすい

所感

とりあえず今はそんなに込み入ったライブラリ事情ではないし、一旦あきらめる。