MailPeeper_menu.appのGmail対応 - OpneSSLライブラリをXcodeから使う5 [プログラミング]
アプリケーションバンドル内の、ダイナミックライブラリをロードするのに苦労したんだけど、結局は
install_name_tool -id
install_name_tool -change
という二つで解決しました。環境関数のせいでも、Xcodeの設定でもなくて、.dylibファイルの設定いかんだったという、何だか嫌な感じな、Macに独特な仕様のせいだったのでした。こっちは、そういうつぶしの効かない無駄な細かい設定は知りたくもないんですが…。
otoolって、MacOSの中のバイナリじゃなくても使えるのね。
libSystem.B.dylibは元から入ってそうなのでいいとして、libz.1.dylibってぇのは一緒に入れてあげないといけないらしい。それにしても、ここいらの設定(/opt/local/lib/)は、なぜずっと残っちゃうのか分からないんだよね。いい加減頭に来る。
install_name_tool -change
で変えられるらしいんだけど、色々やっても一向に直る気配がしない。エラーが出て来れば分かるんだけど、パスを間違えてもエラーが出ないんだよね。こういうエラー処理をまともにしていないツールって自分だけが分かってて使うのならいいけど、一般に配布するに値しないかも。
お手本にFirefoxの中身を見ると下記のような感じ。
@executable_path/ってのが有効みたい。にしても、この状態のdylibに持っていけるもんかな?
ディレクトリを移動しても表示は変わらなかったので、どこにいても設定が有効になると思われ。そりゃどこに移動するか分からないパスを相対パスで扱わなくてどうするんだ、というのは常識的に分かる。でも、MacってWindowsとかLinuxの常識が通用しないところもあるからなぁ。
やっとエラーが出た。すでに設定を持っているらしい。でもさ、上手くはいってないのよね。分からん。あ、-changeでも変えられるみたい。でもtypoでパス名を間違うと直せないっぽい。なんじゃ、このツールの仕様。
自分自身の設定が上書きされないみたい。しなくちゃいけないかどうかは分からないんだけど、やはり根本的に直すのは、ライブラリのビルド時に設定しないとダメなのかも。下は、libssl.1.0.0.dylibを改変して自分のパスを変えようとしたけど、それだけは変えられないんだよね。他のオプションでどうにかなるんかな?
結局、英語を嫌々読んで分かったのが、-idオプションで自分のを設定パスを変えられるってことでした。ライブラリのある位置で次のようなコマンドを打つと、何とかotoolでの見た目は合わせる事ができた。これで大丈夫かな?
何とかイケそうな気がしてきたので、Xcodeに取り込んで使ってみる事にする。
うわ、いきなりダメだ。新しくこれまでの操作で手を入れたdylibを、Xcodeで使うように指定したんだけど、それまで散々プロジェクトの設定をいじくり倒したので、どうにも信頼ならない状態になっているらしい。それまでは、/opt/local/lib/にあるライブラリを見ていたので、変な設定でも無視されて弊害がなかったみたい。
最終的に効いたのは、プロジェクト設定で、動的ライブラリのインストール名ってところ。
LD_DYLIB_INSTALL_NAME = @executable_path/
って感じでやりました。ダイナミックライブラリの設定は、MacOSのバイナリと同じところに設定したので、実行パスとライブラリのパスは同じです。気になるところは、そこぐらいかなぁ。一番の問題は、やっぱりdylibの設定です。install_name_tool -idと、install_name_tool -changeで変更しつつ、otool -Lで確認するといった体で。
インストール直後の環境に置いても、きちんと動作しているので、appバンドル内に含まれているOpenSSLのダイナミックライブラリを使ってくれているみたい。これで一安心。みんなに配布できる形にはできました。ソフト使うのに、MacPorts使ってライブラリ入れろとかあり得ないし。
プロジェクト設定のLD_RUNPATH_SEARCH_PATHSってのを設定してみたりしたけど、説明のところにWebで何度か見た-rpathの名前があった。でもLD_RUNPATH_SEARCH_PATHSでググっても参考になるようなページが見つからない。英語ページは"-rpath" xcodeで六万ぐらいヒットするのに、日本語だけに絞ると300件以下になっちゃう。何だろうね、この差は。良さげな予感がしたけど、結局、要りませんでした。
Murakami Takashi is a disgrace to the art world...
install_name_tool -id
install_name_tool -change
という二つで解決しました。環境関数のせいでも、Xcodeの設定でもなくて、.dylibファイルの設定いかんだったという、何だか嫌な感じな、Macに独特な仕様のせいだったのでした。こっちは、そういうつぶしの効かない無駄な細かい設定は知りたくもないんですが…。
otoolって、MacOSの中のバイナリじゃなくても使えるのね。
$ otool -L libcrypto.1.0.0.dylib libcrypto.1.0.0.dylib: /opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) $ otool -L libssl.1.0.0.dylib libssl.1.0.0.dylib: /opt/local/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) /opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) $ otool -L libssl.1.2.5.dylib libz.1.2.5.dylib: /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
libSystem.B.dylibは元から入ってそうなのでいいとして、libz.1.dylibってぇのは一緒に入れてあげないといけないらしい。それにしても、ここいらの設定(/opt/local/lib/)は、なぜずっと残っちゃうのか分からないんだよね。いい加減頭に来る。
install_name_tool -change
で変えられるらしいんだけど、色々やっても一向に直る気配がしない。エラーが出て来れば分かるんだけど、パスを間違えてもエラーが出ないんだよね。こういうエラー処理をまともにしていないツールって自分だけが分かってて使うのならいいけど、一般に配布するに値しないかも。
お手本にFirefoxの中身を見ると下記のような感じ。
otool -L /Applications/network/Firefox.app/Contents/MacOS/libssl3.dylib /Applications/network/Firefox.app/Contents/MacOS/libssl3.dylib (architecture ppc): @executable_path/libssl3.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libnss3.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libnssutil3.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libplc4.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libplds4.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libnspr4.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.10) /Applications/network/Firefox.app/Contents/MacOS/libssl3.dylib (architecture i386): @executable_path/libssl3.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libnss3.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libnssutil3.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libplc4.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libplds4.dylib (compatibility version 1.0.0, current version 1.0.0) @executable_path/libnspr4.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.10)
@executable_path/ってのが有効みたい。にしても、この状態のdylibに持っていけるもんかな?
ディレクトリを移動しても表示は変わらなかったので、どこにいても設定が有効になると思われ。そりゃどこに移動するか分からないパスを相対パスで扱わなくてどうするんだ、というのは常識的に分かる。でも、MacってWindowsとかLinuxの常識が通用しないところもあるからなぁ。
$ install_name_tool -add_rpath @exexute_path/ libz.1.2.5.dylib install_name_tool: for: libz.1.2.5.dylib (for architecture x86_64) option "-add_rpath @exexute_path/" would duplicate path, file already has LC_RPATH for: @exexute_path/
やっとエラーが出た。すでに設定を持っているらしい。でもさ、上手くはいってないのよね。分からん。あ、-changeでも変えられるみたい。でもtypoでパス名を間違うと直せないっぽい。なんじゃ、このツールの仕様。
$ install_name_tool -change /opt/local/lib/libz.1.dylib @execute_path/libz.1.dylib libcrypto.1.0.0.dylib $ otool -L libcrypto.1.0.0.dylib libcrypto.1.0.0.dylib: /opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) @execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
自分自身の設定が上書きされないみたい。しなくちゃいけないかどうかは分からないんだけど、やはり根本的に直すのは、ライブラリのビルド時に設定しないとダメなのかも。下は、libssl.1.0.0.dylibを改変して自分のパスを変えようとしたけど、それだけは変えられないんだよね。他のオプションでどうにかなるんかな?
$ install_name_tool -change /opt/local/lib/libz.1.dylib @execute_path/libz.1.dylib libssl.1.0.0.dylib $ install_name_tool -change /opt/local/lib/libcrypto.1.0.0.dylib @execute_path/libcrypto.1.0.0.dylib libssl.1.0.0.dylib $ install_name_tool -change /opt/local/lib/libssl.1.0.0.dylib @execute_path/libssl.1.0.0.dylib libssl.1.0.0.dylib $ otool -L libssl.1.0.0.dylib libssl.1.0.0.dylib: /opt/local/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) @execute_path/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) @execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
結局、英語を嫌々読んで分かったのが、-idオプションで自分のを設定パスを変えられるってことでした。ライブラリのある位置で次のようなコマンドを打つと、何とかotoolでの見た目は合わせる事ができた。これで大丈夫かな?
install_name_tool -id @execute_path/libz.1.dylib libz.1.2.5.dylib install_name_tool -id @execute_path/libcrypto.1.0.0.dylib libcrypto.1.0.0.dylib install_name_tool -id @execute_path/libssl.1.0.0.dylib libssl.1.0.0.dylib otool -L *.dylib libcrypto.1.0.0.dylib: @execute_path/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) @execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) libssl.1.0.0.dylib: @execute_path/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) @execute_path/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) @execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) libz.1.2.5.dylib: @execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
何とかイケそうな気がしてきたので、Xcodeに取り込んで使ってみる事にする。
うわ、いきなりダメだ。新しくこれまでの操作で手を入れたdylibを、Xcodeで使うように指定したんだけど、それまで散々プロジェクトの設定をいじくり倒したので、どうにも信頼ならない状態になっているらしい。それまでは、/opt/local/lib/にあるライブラリを見ていたので、変な設定でも無視されて弊害がなかったみたい。
最終的に効いたのは、プロジェクト設定で、動的ライブラリのインストール名ってところ。
LD_DYLIB_INSTALL_NAME = @executable_path/
って感じでやりました。ダイナミックライブラリの設定は、MacOSのバイナリと同じところに設定したので、実行パスとライブラリのパスは同じです。気になるところは、そこぐらいかなぁ。一番の問題は、やっぱりdylibの設定です。install_name_tool -idと、install_name_tool -changeで変更しつつ、otool -Lで確認するといった体で。
インストール直後の環境に置いても、きちんと動作しているので、appバンドル内に含まれているOpenSSLのダイナミックライブラリを使ってくれているみたい。これで一安心。みんなに配布できる形にはできました。ソフト使うのに、MacPorts使ってライブラリ入れろとかあり得ないし。
プロジェクト設定のLD_RUNPATH_SEARCH_PATHSってのを設定してみたりしたけど、説明のところにWebで何度か見た-rpathの名前があった。でもLD_RUNPATH_SEARCH_PATHSでググっても参考になるようなページが見つからない。英語ページは"-rpath" xcodeで六万ぐらいヒットするのに、日本語だけに絞ると300件以下になっちゃう。何だろうね、この差は。良さげな予感がしたけど、結局、要りませんでした。
Murakami Takashi is a disgrace to the art world...
タグ:freesoft
http://www.youtube.com/watch?v=mEQG-1j5ZUo&feature=related
Wishing you a blessed Christmas and joyful holidays.^^V
by yuuri37 (2010-12-25 09:59)
あ、ゆーりさんだ。ありがとうです。近々伺います〜。
by miff (2010-12-26 07:32)
あ、executable_pathがexecute_pathになってますね。executable_pathが正解。そのために、Xcode 4では外側のライブラリを見に行ってしまうハメになっていました。ヒドい目を見た。合掌。
by miff (2011-08-22 10:42)