0

私の目標は、ネイティブ エクステンションを構築することによって、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つのこと:

  1. Snow Leopard 用の XCode 4.1 のインストール - Apple は、理論的にはサポートされているにもかかわらず、このファイルをダウンロードできなくなりました。
  2. Snow Leopard 用の Xcode 3.2.6 のインストール - 4 GB のダウンロードを回避しようとしていましたが、今開始したばかりで、今夜中に試すことができます

特に以前に OS X で couchbase gem をビルドしたことがある場合は、どんな助けも大歓迎です。

4

2 に答える 2

1

自分でgemを構築しようとして同様の苦労をしたことを覚えているので、これは良い質問だと思います。ただし、それは少し前のことであり、自分が何をしたか、またはエラーがあなたのもののように見えるかどうかを思い出すためのファイルなどは手元にありません。

直接の回答ほど良くないことは承知していますが、 https : //groups.google.com/forum/#!forum/couchbase または @avsej 経由で gem の作成者に連絡できるはずです。ツイッター。

于 2012-08-07T19:49:39.907 に答える