Also habe ich auf Mavericks sowie die neueste Version von Xcode (5.02) aktualisiert, und - wie zu erwarten, konnte keine neuen Ruby Edelsteine kompilieren C-Erweiterungen. Dies geschieht speziell mit meinem eigenen Projekt NMatrix, das C- und C++ - Code enthält.Jedes Mal, wenn ich Xcode aktualisiere, bekomme ich Linker Fehler mit brew installiert GCC
Ich habe die Befehlszeilenprogramme für Xcode neu installiert. Dann habe ich Homebrew aufgerüstet. Dann habe ich rbenv, ruby-build und meine benutzerdefinierten GCC-Versionen deinstalliert (mit Ausnahme von 4.7, das manuell anstatt durch brew installiert wurde).
Als nächstes habe ich brew verwendet, um gcc48 (und gcc49 für ein gutes Maß) zu installieren. Ich wies mein Juwel an, mit GCC-4.8.2 anstatt mit dem Entwicklungs-Snapshot von GCC 4.9 zu bauen.
Die gute Nachricht ist, dass mein Edelstein jetzt richtig kompiliert. Die schlechte Nachricht ist, dass es nicht verlinkt wird. Hier ist nur der Verknüpfungsschritt:
$ 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...]
Dies ist aus mehreren Gründen seltsam.
Es ist ein sporadischer Fehler. Wir haben es ein paar Mal gesehen und es scheint immer aus unklaren Gründen wegzugehen.
Ich glaube nicht, dass die
ld: warning
Zeile relevant ist, aber es könnte sein. ATLAS wird von Xcode Accelerate Framework zur Verfügung gestellt, und in der aktuellen Version von Xcode scheint es nicht mehr bei/usr/lib64/atlas
(oder vielleicht war es nie). Dieser Pfad ist nur einer der möglichen Installationsorte und der korrekte Pfad (/usr/local/atlas
) ist ordnungsgemäß enthalten.Wenn ich nach den oben genannten Funktionsprototypen suche, sehe ich viel LLVM-Zeug. Es sind alle Mac OS X Fehler. Das ist Mac-spezifisch. Aber warum sollte LLVM überhaupt verwendet werden, wenn ich den GCC liefere? Verwendet es die richtige Version von GCC für die Kompilierung, aber versucht, mit der falschen Version zu verknüpfen?
Die letzte ist wahrscheinlich die beste Hypothese. Es scheint, als ob dieser Fehler nur auf Computern auftritt, auf denen Sie die Standard-GCC-Installation (Macs, nämlich) nicht überschreiben können.
Ich kann keinen neuen ATLAS installieren, weil es keine bekannte Möglichkeit gibt, Throttling auf einem MacBook Air zu deaktivieren - eine Voraussetzung für die ATLAS-Installation, daher kann ich die ld
Warnung nicht beseitigen.
Hat jemand irgendwelche Gedanken, was diese Fehler bedeuten könnten? Compiler/Linker-Gurus? Jemand?
aktualisieren Es fiel mir ein, in mkmf.log
zu suchen, und ich fand einige zusätzliche Informationen. Sicher genug, es ist ein ATLAS-Problem. Aber ich bin nicht wirklich sicher, warum es nur in dem einen Verzeichnis sucht.
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 */