のリンカエラーが発生するので、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...]
これはいくつかの理由で変です。
これは散発的なエラーです。我々は数回それを見てきました、そして、それは不明確な理由のために、いつも離れているようです。
私は
ld: warning
行は関係ありませんが、それは可能性があります。 ATLASは、XcodeのAccelerateフレームワークによって提供されています.Xcodeの現在のバージョンでは、もはや/usr/lib64/atlas
にあるようには見えません(あるいはそれは決してそうではありませんでした)。そのパスはインストール可能な場所の1つに過ぎず、正しいパス(/usr/local/atlas
)が適切に含まれています。上記の関数プロトタイプを検索すると、たくさんの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 */