Darwin gccでの LD_RUN_PATH

知らない事だらけだ。

シェアードライブラリをロードするときのライブラリパスをコンパイル時に 埋め込む $LD_RUN_PATH とか ld -rpath みたいなのがDarwinにはないなあ。 と思っていたら、それは、動的ライブラリを作るときにその動的ライブラリ をインストールするパスという情報で埋め込むようだ。つまり、 動的ライブラリを利用するコマンドをリンクするときではなく、 動的ライブラリそのものをmakeするときにパス情報を埋め込む。 これもひとつの方法だなあ。賢いようにも感ずる。

さて、分かったことを書くけれども、以下の内容は全くの誤解かも。

動的ライブラリを作るには

gcc -dynamiclib \
 -install_name /full/path/to/libhogehoge.X.dylib \
 -current_version N -compatibility_version N \
 -o libhogehoge.VERSION.dylib *.o
      

ってな具合に作成するのだが、この -install_name のところに フルパスを埋め込むのが味噌。これをちゃんとしていないパッケージが 多いのでちうい。

libtiffとかNetPBMはいちおう Mac OS X でmakeはできるものの この -install_name に /libhogehoge.X.dylib なんてのを指定しちゃう もんだから libtiff.3.6.1.dylib なんかをリンクしたコマンドを 実行するときに探せなくて怒られる。ってことで、libhogehoge.dylib をリンク する様子をちゃんと見張って、-install_name に所望のディレクトリ名を 埋め込んでくれているかをチェックせんとなあ。

てことで、netpbm-10.18.15 はインストール完了。 ./lib/ にて、

% cc -no-cpp-precomp -L/usr/iekei/graphics/lib -L/usr/iekei/netpbm/lib \
-dynamiclib -install_name /usr/iekei/netpbm/lib/libnetpbm.10.dylib -o \
libnetpbm.10.18.dylib libpm.o fileio.o bitio.o colorname.o libpbm1.o \
libpbm2.o libpbm3.o libpbm5.o libpgm1.o libpgm2.o libppm1.o libppm2.o \
libppmcmap.o libppmcolor.o libppmd.o libppmfloyd.o libpnm1.o libpnm2.o \
libpnm3.o libpam.o libpammap.o libsystem.o util/shhopt.o util/nstring.o \
-lc

と手動でやってからmakeし直してめでたしめでたし。


叱咤激励感想ツッコミはゲストブック

Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]