SSブログ

MailPeeper_menu.appのGmail対応 - OpneSSLライブラリをXcodeから使う1 [プログラミング]

検証コードでは、gccの引数いかんで、ライブラリの関数を取り入れる事ができました。Xcodeなプロジェクトではまだやってないので、XcodeでC言語のライブラリを使いたいと思います。できれば、外部のライブラリが要らないようにしたい。というか、別途ライブラリ導入ってダメでしょ。だから.appに内包したいのです。



参考になりそうなのは以下のリンク。どっちも画面キャプチャがあってわかりやすい。自分はここまでの事はしたくないな。やれる、という事実を伝えます。

 http://cocoadays.blogspot.com/2010/11/ios-static-library-1.html
 http://www.macmacmac.mydns.jp/modules/tinyd0/index.php?id=11

どっちもXcodeで作ったライブラリを、Xcodeで使うというもので、OpenSSLライブラリをXcodeに適合させるのはしんどそう。「./configure && make && sudo make install」なライブラリを、Xcodeでコンパイルってあんまり生産的な作業じゃない気がするのね。

どうにか普通にgccから吐き出される.aなスタティックライブラリか、.dylibなダイナミックライブラリを導入させる事はできないのだろうか。誰かやってないかなー。



これとか良さげだなぁ。

 http://www.geocities.jp/parastyx/CUDA/

うぁやっぱ、内部でライブラリを持ってっていう形になってない。まんま、C言語で作ったライブラリのパスをリンクしてあげているだけだ。このくらいの事なら設定でできそうなのはわかっている。だって、まんまgccでやった検証コードの設定を反映してあげれば良いだけの話だろうから。

んー有用な情報がないな。自分で試行錯誤するしかないのかな…。




やっぱりOpenSSLをgccとかで作ったのって、Xcodeで使えないのかな。色々ググっているけど、どうにも的を射ていないのだが、絞りすぎて英語サイトばっかり引っかかってくる。特に気にせず、適当にlibssl.dylibを入れてコンパイルして、詳しくビルド結果を見てみた(それまでキチンと見とらんかった)。

ld: warning: in なんとかかんとか/libssl.dylib, file was built for unsupported file format which is not the architecture being linked (i386)

って書いてあるから、ユニバーサルバイナリにi386用のバイナリが必要らしい。確かにコンパイルするときは、x86_64でコンパイルした覚えがある。MacPortsでopensslを入れたときも、多分、x86_64でコンパイルしてるんじゃないか、と思われ。

file /opt/local/lib/libssl.1.0.0.dylib 
/opt/local/lib/libssl.1.0.0.dylib: Mach-O 64-bit dynamically linked shared library x86_64


を、やっぱりMacPortsではi386のは入ってないみたい。ここでちょっと考える。mailpeeper_menu.appを64bit化をすれば良いのでは、という考えと、gccの引数を変えたりして、libssl.dylib側をユニバーサルバイナリで32bit対応する、ということ。

 file もにょもにょ/MailPeeper_Menu.app/Contents/MacOS/MailPeeper_Menu
 もにょもにょ/MailPeeper_Menu.app/Contents/MacOS/MailPeeper_Menu: Mach-O executable i386

確かにコンパイルされてるのは、i386用にしかコンパイルされてない。つーか、fileっていうコマンドすげーな、名前が。だってファイルだよ。名前つけた人間の意図がわからん。今までUniversal Binaryなんて特に気にもしてなかったんだけど、直接こういう状態に陥ると真剣に調べざるを得ない。ええと、XcodeでCocoaのユニバーサルバイナリってどうなってるんだ。


プロジェクトの設定で、アーキテクチャ(ARCHS)を32bit Universalから、Standard(32/64-bit universal)にして、クリーンしてコンパイルし直し。なんでXcodeにはVisual Studioみたいに、リビルドがないんだろうか。気を使っていちいち単独でクリーン、ビルドとかしたくないんだけど。それにクリーンする時にいちいちダイアログが出るのもうざい。

結果は、結局、変わらず。アクティブアーキテクチャをx86_64にしても、どうにもi386の部分で引っかかってリンクが通らない。こうなったら無理矢理、通したくなってきた。プロジェクト設定のアーキテクチャを64bit-Intelにしてみたら、ザラザラと出ていたリンクのエラーがほとんど消えた。SSH_read()だけ残ってるのが気になるが、リンクはコレでいけそう。

でも、お作法としては、.appも.dylibも、どっちもユニバーサルバイナリで、32bit(x386)と64bit(x86_64)を両対応にした方がいい。でも、面倒くさいな。特にMakefileなりconfigureなりを改変しなくてはならないopensslをコンパイルし直すのは面倒。それは、そのうちすることにして、無視して先に進みたい。


先のSSL_read()が見えないという問題はわけが分からない。リンクが通らないと当然バイナリができないので厳しい。まず、OpenSSLのヘッダファイル、ssl.hには書いてある。もちろん、libssl.dylibにも入ってる。下記のコードで確かめ済み。

 nm libssl.dylib | grep SSL_read

呼んでいるSSL_read()をコメントアウトして、ビルドすると最後までリンクが通った。なぜゆえ、SSL_readのみ問題なん? あ、SSL_read()が、SSH_read()になっとる…。うわ、恥ずかしいTYPOミスや。このくらい短い関数名だと手で打ち込んじゃうのもあって、ミスを見逃していた。それにSSLとSSHって意味的にも似てるし…。疲れたので続きは後日。

タグ:freesoft
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。