Ich habe Probleme mit dem Linker beim Portieren einer C-Bibliothek von Linux (Ubuntu) nach OS X. Der C-Code wird automatisch von Matlab generiert Idealerweise möchte ich den Code nicht selbst ändern.OS X-Linker kann keine Symbole aus einer C-Datei finden, die nur Variablen enthält
Das Problem scheint in einer C-Datei zu sein, die NUR nicht initialisierte Variablendeklarationen enthält, die dann von anderen C-Dateien EXTERNed werden, um die Matlab-Algorithmen zu implementieren. Der OS X-Linker kann scheinbar keine Symbole aus dieser Datei erkennen. Derselbe Quellcode funktioniert unter Linux gut, daher möchte ich verstehen, wie sich der OS X-Linker anders verhält und ob es eine Markierung gibt, die ich übergeben kann, um das Verhalten zu ändern.
Die statische Bibliothek wird ohne Fehler/Warnungen erstellt. Aber beim Erstellen von Anwendungen, die die statische Bibliothek verweist, wird die folgende Fehlermeldung (auf OS X) geworfen:
Undefined symbols for architecture x86_64:
"_my_var", referenced from:
_algorithm in libtestlibrary.a(algorithm.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Ein ‚nm‘ zeigt, dass in der Tat libtestlibrary.a Symbol _my_var enthält.
Eine viel vereinfachte Version des Codes von Matlab folgt unten.
Bibliothek Code:
// DATA.C : declaration of data
#include "data.h"
int my_var;
// DATA.H - extern declaration of data
#ifndef H_DATA
#define H_DATA
extern int my_var;
#endif
// ALGORITHM.C - performs the calculation
#include "data.h"
int algorithm(int x) {
my_var += x;
return my_var;
}
//ALGORITHM.H - declaration of library API
#ifndef H_ALGORITHM
#define H_ALGORITHM
int algorithm(int x);
#endif
Bibliothek bauen Befehle:
gcc -c algorithm.c
gcc -c data.c
ar rcs libtestlibrary.a data.o algorithm.o
Code Anwendung:
// MAIN.C : Code which calls into the static library
#include "algorithm.h"
int main() {
int x = 1;
x = algorithm(x);
return 0;
}
Anwendung bauen Befehle:
gcc -c main.c
gcc -o testapp main.o -ltestlibrary
Wenn ich die Definition in dat.c in 'int my_var = 0' ändere, so dass die Variable initialisiert wird, dann bauen die Bibliothek und die Anwendung sowohl unter Linux als auch unter OS X korrekt auf. Wie ich oben sagte, tue ich das nicht Ich möchte den Code nicht ändern, da er automatisch von Matlab generiert wird.
Vielen Dank im Voraus für Ihre Hilfe!
Danke dafür; Ich hatte bereits bemerkt, dass wenn ich my_var initialisiere, es OK funktioniert. Was ich nicht verstehe ist, warum sich das Verhalten unter OS X und Linux unterscheidet. Ist das ein Fehler im OS X Linker? – geekydel
@geekydel Es ist kein Fehler, es ist die Tatsache, dass ausführbare Formate für Linux (die ELF verwendet) und OS X, das Mach-O verwendet, unterschiedlich sind. Letzteres scheint Datensymbole nicht als allgemeine Symbole in statischen Bibliotheken zu mögen. –
@geekydel Ich habe es gefunden. Schau meine Bearbeitung an. –