2013-11-15 7 views
5

のリンカエラーが発生するので、MavericksとXcode(5.02)の最新バージョンにアップグレードしました。 - 予想通り、新しいRuby gemをコンパイルできませんでしたC拡張。これは、CとC++コードを含む自分のプロジェクト、NMatrixで特に発生します。私はXcodeをアップグレードするたびに、BREWがインストールされたGCC

Xcode用のコマンドラインツールを再インストールしました。その後、私は自家製のものをアップグレードしました。その後、rbenv、ruby-build、および私のカスタムGCCバージョンをアンインストールしました(ただし、4.7はbrewではなく手動でインストールしました)。

次に、bccを使用してgcc48をインストールしました。 GCC 4.9の開発スナップショットではなく、GCC-4.8.2で構築するように私の宝石に指示しました。

良いニュースは、私の宝石が正しくコンパイルされることです。悪い知らせは、それがリンクしないということです。ここにリンクするステップがあります:

$ bundle exec rake compile 
cd tmp/x86_64-darwin13.0.0/nmatrix/2.0.0 
make 
linking shared-object nmatrix.bundle 
ld: warning: directory not found for option '-L/usr/lib64/atlas' 
0 0x10ef3f724 __assert_rtn + 144 
1 0x10ef7425e archive::File<x86_64>::makeObjectFileForMember(archive::File<x86_64>::Entry const*) const + 1118 
2 0x10ef73c3b archive::File<x86_64>::justInTimeforEachAtom(char const*, ld::File::AtomHandler&) const + 139 
3 0x10ef883fe ld::tool::InputFiles::searchLibraries(char const*, bool, bool, bool, ld::File::AtomHandler&) const + 210 
4 0x10ef8f181 ld::tool::Resolver::resolveUndefines() + 189 
5 0x10ef911a5 ld::tool::Resolver::resolve() + 79 
6 0x10ef3fb17 main + 669 
A linker snapshot was created at: 
    /tmp/nmatrix.bundle-2013-10-15-085036.ld-snapshot 
ld: Assertion failed: (memberIndex != 0), function makeObjectFileForMember, file /SourceCache/ld64/ld64-224.1/src/ld/parsers/archive_file.cpp, line 355. 
collect2: error: ld returned 1 exit status 
make: *** [nmatrix.bundle] Error 1 
rake aborted! 
Command failed with status (2): [make...] 

これはいくつかの理由で変です。

  1. これは散発的なエラーです。我々は数回それを見てきました、そして、それは不明確な理由のために、いつも離れているようです。

  2. 私はld: warning行は関係ありませんが、それは可能性があります。 ATLASは、XcodeのAccelerateフレームワークによって提供されています.Xcodeの現在のバージョンでは、もはや/usr/lib64/atlasにあるようには見えません(あるいはそれは決してそうではありませんでした)。そのパスはインストール可能な場所の1つに過ぎず、正しいパス(/usr/local/atlas)が適切に含まれています。

  3. 上記の関数プロトタイプを検索すると、たくさんのLLVMがあります。それはすべてのMac OS Xのエラーです。これはMac固有のものです。しかし、なぜ私はGCCを提供しているときにLLVMを使用していますか?コンパイルには正しいバージョンのGCCを使用していますが、間違ったバージョンにリンクしようとしていますか?

おそらく最後の仮説です。このエラーは、デフォルトのGCCインストール(Macs、つまり)を上書きできないコンピュータにのみ表示されるようです。

ATLASインストールの前提条件であるMacBook Airのスロットルをオフにする方法が知られていないため、新しいATLASをインストールできないため、ldの警告を取り除くことはできません。

これらのエラーが何を意味するかについて、誰もが考えていますか?コンパイラ/リンカの達人?誰でも?

更新 mkmf.logに見て、私に起こった、と私はいくつかの追加情報を見つけました。確かに、それはATLASの問題です。しかし、私は本当になぜそれが1つのディレクトリを探しているのか分かりません。

ld: warning: directory not found for option '-L/usr/lib64/atlas' 
Undefined symbols for architecture x86_64: 
    "_ATL_dgemm", referenced from: 
     _cblas_dgemm in libcblas.a(cblas_dgemm.o) 
    "_ATL_dsyreflect", referenced from: 
     _cblas_dgemm in libcblas.a(cblas_dgemm.o) 
    "_ATL_dsyrk", referenced from: 
     _cblas_dgemm in libcblas.a(cblas_dgemm.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <cblas.h> 
4: 
5: /*top*/ 
6: extern int t(void); 
7: int t(void) { void ((*volatile p)()); p = (void ((*)()))cblas_dgemm; return 0; } 
8: int main(int argc, char **argv) 
9: { 
10: if (argc > 1000000) { 
11:  printf("%p", &t); 
12: } 
13: 
14: return 0; 
15: } 
/* end */ 

"gcc -o conftest -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/x86_64-darwin13.0.0 -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/backward -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0 -I../../../../ext/nmatrix -I/usr/local/atlas/include -I/usr/include/atlas -Wall -Werror=return-type -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -Wall -Werror=return-type -O3 -Wno-error=shorten-64-to-32 -pipe conftest.c -L. -L/Users/jwoods/.rbenv/versions/2.0.0-p247/lib -L/usr/local/atlas/lib -L/usr/local/lib -L/usr/lib -L/usr/lib64/atlas -L. -L/Users/jwoods/.rbenv/versions/2.0.0-p247/lib -L/usr/local/lib -lcblas -llapack -lruby-static -lcblas -llapack -lpthread -ldl -lobjc " 
conftest.c:7:27: error: too few arguments to function call, expected 14, have 0 
int t(void) { cblas_dgemm(); return 0; } 
       ~~~~~~~~~~~^
/usr/local/atlas/include/cblas.h:470:1: note: 'cblas_dgemm' declared here 
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 
^ 
1 error generated. 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <cblas.h> 
4: 
5: /*top*/ 
6: extern int t(void); 
7: int t(void) { cblas_dgemm(); return 0; } 
8: int main(int argc, char **argv) 
9: { 
10: if (argc > 1000000) { 
11:  printf("%p", &t); 
12: } 
13: 
14: return 0; 
15: } 
/* end */ 

答えて

0

私は答えを見つけたと信じています。 extconf.rb(Makefileを生成する)のlib検索ディレクトリの1つが/usr/lib64/であり、これはシステム上に存在しません。だから私は一度それを検索パスから削除して、適切にコンパイルしてリンクしました。

$libs定義には、有用であるかもしれないし有用でないかもしれない項目も追加されました。

それは$libs += " -llapack -lcblas -latlas "されてからに行ってきました:

$libs += " -llapack -lclapack -lcblas -latlas " 

しかし、その最後のビットが中にではなく、リンク後の問題を解決しました。

関連する問題