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 --version
Apple LLVM version 8.0.0 (clang-800.0.42.1) x86_64-apple-darwin16.4.0
.
Ist 'LD_LIBRARY_PATH =. ./a.out' macht einen Unterschied? – dhke
@dhke: Nein, und auch nicht für 'DYLD_LIBRARY_PATH'. – Cornstalks
'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