2017-03-18 1 views
0

Hier ist ein einfaches Beispiel:Warum kann ich eine gemeinsam genutzte Bibliothek nicht umbenennen, nachdem sie erstellt wurde?

lib.c:

#include <stdio.h> 

void hello_world(void) { 
    puts("Hello, world!"); 
} 

programm.c:

void hello_world(void); 

int main() { 
    hello_world(); 
    return 0; 
} 

Wenn ich die Bibliothek normalerweise und verknüpfen es kompilieren, funktioniert alles einwandfrei :

$ cc lib.c -fPIC -shared -o libmylib.dylib 
$ cc program.c -L. -lmylib 
$ ./a.out 
Hello, world! 

Aber wenn ich die Bibliothek nach dem Bau es (aber vor dem Erstellen des Programms) umbenennen, funktioniert es nicht:

$ cc lib.c -fPIC -shared -o totally_different_name.dylib 
$ mv totally_different_name.dylib libmylib.dylib 
$ cc program.c -L. -lmylib 
$ ./a.out 
dyld: Library not loaded: totally_different_name.dylib 
    Referenced from: /private/tmp/./a.out 
    Reason: image not found 
[1] 13229 abort  ./a.out 

Warum ist dies der Fall? Warum sucht dyld nach dem ursprünglichen Bibliotheksnamen?

Das funktioniert unter Linux gut, aber wenn ich es auf macOS versuche, scheitert es komplett (ich weiß nicht, ob es eine Mac OS vs Linux-Sache ist oder ein clang vs gcc-Ding, da ich clang auf macOS und gcc verwende unter Linux).

Wenn es relevant ist, ist cc --versionApple LLVM version 8.0.0 (clang-800.0.42.1) x86_64-apple-darwin16.4.0.

+0

Ist 'LD_LIBRARY_PATH =. ./a.out' macht einen Unterschied? – dhke

+0

@dhke: Nein, und auch nicht für 'DYLD_LIBRARY_PATH'. – Cornstalks

+0

'Otool -L./a.out' sollte Ihnen die Liste der Abhängigkeiten geben, die das Programm deklariert. Zumindest könnte das helfen, das Problem einzugrenzen. – dhke

Antwort

0

Dank Florian Zwoch's comment konnte ich einen Weg finden, dies zu beheben. Führen Sie diesen Befehl nach dem dylib Umbenennung:

install_name_tool -id libmylib.dylib libmylib.dylib 

Das ändert sich die interne ID des dylib befehlen. Die Befehlssyntax lautet install_name_tool -id <new-id> <dylib-path>.

Ursprünglich hat die Dylib die ID total_different_name.dylib. Das Umbenennen der Datei ändert nicht die ID, die sie intern gespeichert hat und die separat mit install_name_tool aktualisiert werden muss.

+0

Meine Antwort zeigt, wie das Problem behoben werden kann, aber mir fehlt die nötige Tiefe an Wissen, um besser zu erklären, was passiert und warum. Wenn jemand eine Antwort schreibt, die besser erklärt, wie Dylibs funktionieren, wie Clam sie erstellt, wie MacOS sie verwendet und warum dieser zusätzliche Schritt notwendig ist, werde ich diese Antwort gerne annehmen. – Cornstalks

Verwandte Themen