私の目標は、ネイティブ エクステンションを構築することによって、couchbase ruby gem をインストールすることですが、gem と libcouchbase C ライブラリとの間にアーキテクチャの不一致のように見えるものがあります。ここにいくつかの背景があります:
- rvm を使用して OS X 10.6.8 を実行しており、ソースからビルドされた ruby 1.9.2-p320 を実行しています。
- 昨日まで OS X 10.6.7 と Xcode 3.2.5 を使っていたのですが、ネイティブで libcouchbase をビルドできませんでした。
- 次に、libcouchbase のインストールを容易にすることが知られている brew をインストールしました。brew は、少なくとも Xcode 3.2.6 にアップグレードする必要があると教えてくれました。
- Xcode 3.2.6 よりも 2 ギガ以上小さいため、とらえどころのない Snow Leopard 用の Xcode 4.2 をダウンロードし、最新バージョンを入手できると考えました。
- システムインストーラーのバグの結果であることがわかった証明書エラーが原因で、Xcode がインストールされませんでした。修正は、OS X 10.6.8 にアップグレードしてから、システムアップデートを適用することでした。
- 数時間後に再起動すると、XCode 4.2 がインストールされた OS X 10.6.8 が実行され、libcouchbase は問題なく brew でコンパイルされます
- 現在、couchbase gem をインストールしようとしていますが、ネイティブ拡張のビルドに失敗しています。ライブラリの場所を明示的に渡してもlibcouchbaseが見つからないと言われています
- mkmf.log を調べると、次のように表示されます (太字の強調が追加されていますが、問題については間違っている可能性があります!
19/lib -L/opt/local/lib -L/usr/local/lib -L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/lib -L/Users /emkman/.rvm/usr/lib -L. -arch i386 -arch x86_64 -L/usr/local/lib -arch i386 -arch x86_64 -lruby.1.9.1-static -lpthread -ldl -lobjc " チェックしたプログラムは:
/* begin */
1: #include "ruby.h"
2:
3: int main() {return 0;}
/* end */
"/usr/bin/gcc-4.2 -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/universal-darwin10.8.0 -I/Users/emkman/. rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/ruby/backward -I/Users/emkman/.rvm/rubys/ruby-1.9.2-p320/include/ruby-1.9.1 -I. -I/usr/local/Cellar/libevent/2.0.19/include -I/opt/local/include -I/usr/local/include -I/Users/emkman/.rvm/rubies/ruby-1.9 .2-p320/include -I/usr/include -I/Users/emkman/.rvm/usr/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith - Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long -arch i386 -arch x86_64 -fno-common -pipe -std=c99 -Wall -Wextra -arch i386 -arch x86_64 -c conftest.c" チェックされたプログラムは次のとおりです。
/* begin */
1: #include "ruby.h"
2:
3: #include <stdarg.h>
4: int foo(int x, ...) {
5: va_list va;
6: va_start(va, x);
7: va_arg(va, int);
8: va_arg(va, char *);
9: va_arg(va, double);
10: return 0;
11: }
12: int main() {
13: return foo(10, "", 3.14);
14: return 0;
15: }
/* end */
have_library: -lcouchbase で libcouchbase_server_versions() をチェックしています... -------------------- いいえ
19/lib -L/opt/local/lib -L/usr/local/lib -L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/lib -L/Users /emkman/.rvm/usr/lib -L. -arch i386 -arch x86_64 -L/usr/local/lib -arch i386 -arch x86_64 -lruby.1.9.1-static -lcouchbase -lpthread -ldl -lobjc " ld: 警告: ファイル /usr/local/lib/libcouchbase.dylib を無視します。ファイルは、リンクされているアーキテクチャーではない、サポートされていないファイル形式用にビルドされました (i386) .o ld: アーキテクチャ i386 のシンボルが見つかりません collect2: ld は 1 つの終了ステータスを返しました lipo: 入力ファイルを開けません: /var/folders/AT/ATO2AJa-G3Ogm+J4qma1hE+++TI/-Tmp-/ mkmf_20120724-40695-16d2a4n/ccAGPue9.out (そのようなファイルまたはディレクトリはありません) チェックされたプログラムは:
/* begin */
1: #include "ruby.h"
2:
3: #include <libcouchbase/couchbase.h>
4:
5: /*top*/
6: int main() {return 0;}
7: int t() { void ((*volatile p)()); p = (void ((*)()))libcouchbase_server_versions; return 0; }
/* end */
19/lib -L/opt/local/lib -L/usr/local/lib -L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/lib -L/Users /emkman/.rvm/usr/lib -L. -arch i386 -arch x86_64 -L/usr/local/lib -arch i386 -arch x86_64 -lruby.1.9.1-static -lcouchbase -lpthread -ldl -lobjc " conftest.c: 関数 't' 内: conftest.c :7: エラー: 関数 'libcouchbase_server_versions' への引数が少なすぎます conftest.c: 関数 't' 内: conftest.c:7: エラー: 関数 'libcouchbase_server_versions' への引数が少なすぎます lipo: : /var/folders/AT/ATO2AJa-G3Ogm+J4qma1hE+++TI/-Tmp-/mkmf_20120724-40695-cblicr/ccG9E6Cp.out チェックされたプログラム:
/* begin */
1: #include "ruby.h"
2:
3: #include <libcouchbase/couchbase.h>
4:
5: /*top*/
6: int main() {return 0;}
7: int t() { libcouchbase_server_versions(); return 0; }
/* end */
だから問題は、gccが/usr/local/lib/libcouchbase.dylibのi386ビルドを探していて、私のショーを調べていることだと私には思えます
/usr/local/lib/libcouchbase.dylib: Mach-O 64 ビットの動的にリンクされた共有ライブラリ x86_64
それでは、私の質問に移りましょう。これは問題ですか、それともニシンですか? libcouchbase を i386 またはユニバーサルとしてビルドする必要がありますか、それとも gem 側に問題がありますか? 私は、このシステムで何年も問題なくネイティブの gem 拡張機能を構築してきました。これには、時には厄介な mysql gem も含まれますが、現在は新しいバージョンの GCC/Xcode を使用しています。rvm のリリース ノートによると、Xcode 4.2 は Ruby 1.9.3 でのみ動作し、多くのネイティブ拡張が機能しなくなるため、完全にアンインストールしてから、https: //github.com/kennethreitz/osx-gcc- から GCC-10.6.pkg をインストールしました。 rvmが推奨するインストーラー/ですが、私はまだ同じ問題を抱えています。これが私のbrew --envダンプです:
CC: /usr/bin/llvm-gcc => /usr/llvm-gcc-4.2/bin/llvm-gcc-4.2
CXX: /usr/bin/llvm-g++ => /usr/llvm-gcc-4.2/bin/llvm-g++-4.2
LD: /usr/bin/llvm-gcc => /usr/llvm-gcc-4.2/bin/llvm-gcc-4.2
CFLAGS: -Os -w -pipe -march=core2 -msse4.1 -mmacosx-version-min=10.6
CXXFLAGS: -Os -w -pipe -march=core2 -msse4.1 -mmacosx-version-min=10.6
CPPFLAGS: -isystem /usr/local/include
LDFLAGS: -L/usr/local/lib
MACOSX_DEPLOYMENT_TARGET: 10.6
メイクフラグ: -j2
現在も Xcode 4.2 をインストールしたときも、 -march はcore2に設定されていました。代わりにこれをネイティブにする必要がありますか? 最新の osx-gcc ツールチェーンをインストールした後、rvm/JewelryBox を介してソースから ruby 1.9.2-p320 を再構築し、同じフラグが使用されていることを確認しました。それはユニバーサルダーウィンとして構築されており、正しいようです:
interpreter: "ruby"
version: "1.9.2p320"
date: "2012-04-20"
platform: "universal.x86_64-darwin10.8.0"
patchlevel: "2012-04-20 revision 35421"
full_version: "ruby 1.9.2p320 (2012-04-20 revision 35421) [universal.x86_64-darwin10.8.0]"
これが多くの情報であることは承知していますが、詳細を徹底的に調べ、ほとんどすべてを試したことを示したいと思います. また、libcouchbase の開発者プレビューと組み合わせて gem の開発者プレビューを試してみたことにも言及する必要がありますが、エラーは同じです。私が試していない2つのこと:
- Snow Leopard 用の XCode 4.1 のインストール - Apple は、理論的にはサポートされているにもかかわらず、このファイルをダウンロードできなくなりました。
- Snow Leopard 用の Xcode 3.2.6 のインストール - 4 GB のダウンロードを回避しようとしていましたが、今開始したばかりで、今夜中に試すことができます
特に以前に OS X で couchbase gem をビルドしたことがある場合は、どんな助けも大歓迎です。