2013-11-15 10 views
5

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.

  1. Es ist ein sporadischer Fehler. Wir haben es ein paar Mal gesehen und es scheint immer aus unklaren Gründen wegzugehen.

  2. 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.

  3. 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 */ 

Antwort

0

Ich glaube, ich habe eine Antwort gefunden. Eines der Lib-Suchverzeichnisse in der extconf.rb (die das Makefile generiert) war /usr/lib64/, die nicht auf dem System vorhanden ist. Sobald ich das aus dem Suchpfad entfernt habe, kompiliert und verknüpft es ordnungsgemäß.

Ich habe auch einen Eintrag in die $libs Definition hinzugefügt, die nützlich sein kann oder nicht.

Es ging von $libs += " -llapack -lcblas -latlas " zu sein:

während
$libs += " -llapack -lclapack -lcblas -latlas " 

Aber das letzte Bit gelöst Probleme nach der Verknüpfung nicht.

Verwandte Themen