2016-04-09 5 views
1

Ich habe ein Projekt, das auf Xcode 7.2 und früher, aber gets linker errors when compiling with Xcode 7.3 fein kompiliert. Ich konnte es auf simple example project eingrenzen, das das Problem dupliziert.Xcode 7.3 + Verknüpfung zu relativen Pfaden = ld: Datei nicht gefunden: ../lib/lib_.dylib

Die Grundstruktur Projekt ist wie folgt:

. 
├── one 
│   ├── lib 
│   │   └── lib1.dylib 
│   └── src 
│    └── one.c 
├── two 
│   ├── lib 
│   │   └── lib2.dylib 
│   └── src 
│    └── three.c 
└── three 
    ├── lib 
   │   └── lib3.dylib 
    └── src 
     └── two.c 

lib3 Links mit lib2 und lib2 Links mit lib1. Wenn die Bibliothek kompiliert wird, befindet sich ihre Ausgabe im Verzeichnis ../lib relativ zu ihrem Verzeichnis src.

Wenn ich versuche, lib3 zu kompilieren, Fehler mit , obwohl ../../one/lib in der Bibliothek Suchpfad ist.

Welche seltsame und mystische Linker-Flagge kann ich verwenden, um die Suchpfade zum Laufen zu bringen, okay? Oder ist das ein Fehler mit Xcode?

/Applications/Xcode.app/Contents/Developer/usr/bin/make -C one/src 
cc -I ../../include -c -o one.o one.c 
cc -dynamiclib -undefined dynamic_lookup -flat_namespace -o ../lib/lib1.dylib one.o 
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C two/src 
cc -I ../../include -c -o two.o two.c 
cc -dynamiclib -undefined dynamic_lookup -flat_namespace -L ../../one/lib -o ../lib/lib2.dylib two.o -l1 
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C three/src 
cc -I ../../include -c -o three.o three.c 
cc -dynamiclib -undefined dynamic_lookup -flat_namespace -L ../../two/lib -L ../../one/lib -o ../lib/lib3.dylib three.o -l2 
ld: file not found: ../lib/lib1.dylib for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[1]: *** [../lib/lib3.dylib] Error 1 
make: *** [all] Error 2 

Antwort

1

OK, ich habe eine Weile gebraucht, um diesen Fehler zu beheben. Ich wusste, dass Teil des Problems war, die runpath und die Installationsname der Bibliotheken, so dass sie während der Verknüpfung und zur Laufzeit, die das nächste Problem, das Sie konfrontiert waren gefunden werden konnte.

Ich entschied mich für den Aufbau der Bibliotheken in eine gemeinsame Top-Level-lib-Verzeichnis, aber am Ende des Tages bin ich mir ziemlich sicher, dass eigentlich nicht notwendig war, aber es reduzierte Befehlszeilenoptionen zu übergeben der Linker, der sehr umständlich ist, wie es mit -Wl,-linker-option und -Wl,linker-option-argument getan werden muss, wie Sie cc für das Verlinken eher als ld direkt verwenden.

ich glaube, die eigentliche Antwort ist -l1 auf Ihre three/src/Makefile Zeile hinzufügen:

$(LD) -o [email protected] $< -l2 -l1 

Es ist mir nicht klar, warum dies so notwendig war, wenn lib3 auf lib2 hängt dann sollte es nicht notwendig sein lib2 hinzufügen Abhängigkeiten in die Linker-Linie. Es ist vielleicht etwas mit Ihrer Verwendung von -undefined dynamic_lookup zu tun, wie ich diese Option noch nie zuvor gesehen habe. Allerdings hatte ich keine Zeit, damit zu experimentieren.

Wenn Sie diese Änderung Ihrer Version der Makefile s machen werden Sie wahrscheinlich haben Laufzeitprobleme wie die RUNPATH und installieren Name impliziert von was auch immer Sie zu -L bestanden (das war ../../one/lib und ../../two/lib und sie werden fast sicherlich zur Laufzeit falsch sein). Deshalb ist es besser, explizit Namen der RUNPATH und installieren zu setzen, und jede Bibliothek hatte ihre RUNPATH Set @loader_path/ und ihre Namen Satz @rpath/libX.dylib installieren. Die ausführbare Datei, die diese Bibliotheken verwendet, wird wahrscheinlich einen anderen runpath benötigen, um die Bibliotheken zu finden.

Siehe meine pull request für die Änderungen, die ich gemacht habe.

Ich möchte Ihnen empfehlen, wie Sie diese Frage mit einem testbaren Projekt auf github präsentiert haben; Ohne das würden Sie wahrscheinlich kein anständiges Feedback bekommen.

+0

Danke für eine ausführliche Antwort. Ich habe nicht die Möglichkeit, die Lib-Verzeichnisse im realen Projekt zu kombinieren, aber die anderen Informationen sollten sehr hilfreich sein. FWIW, -undefined dynamic_lookup bewirkt, dass zur Linkzeit nicht definierte Symbole zur Laufzeit dynamisch aufgelöst werden. Ich frage mich, ob das der Grund für einige meiner Probleme ist ... – leedm777

+0

@ leedm777 Ich würde ohne versuchen. Um die Bibliotheken getrennt zu halten, sollte es nur möglich sein, mehr "-Wl" -Optionen in "$ (LD)" zu übergeben und nicht mehr. – trojanfoe