Undefined first referenced
symbol in file
mx__writebar /var/tmp/mx-1.2.9/libmyriexpress/user32/libmyriexpress.a(mx__shmem.o)
mx__stbar /var/tmp/mx-1.2.9/libmyriexpress/user32/libmyriexpress.a(mx__lib.o)
mx__readbar /var/tmp/mx-1.2.9/libmyriexpress/user32/libmyriexpress.a(mx__lib.o)
In libmyriexpress.a wird auf die Symbole (Funktionen oder Variablen) mx__writebar, mx__stbar und mx__readbar zugegriffen, der Linker kann diese aber nirgendwo finden.
Die erste Frage wäre also "wo befindet sich mx__writebar überhaupt?" Hat man die mögliche Quelle lokalisiert geht es darum festzustellen warum der Linker das entsprechende Modul nicht gefunden hat. (Wurde die Datei überhaupt übersetzt? Ist sie Teil einer Bibliothek libXYZ.a? Wird die Datei bzw. Bibliothek auch in der Linker-Kommandozeile genannt?)
...
...
gcc -m32 -o fma fma.o fma_dfs_route.o fma_error.o fma_fabric.o fma_fms.o fma_log.o fma_map.o fma_map_fabric.o fma_mom_moe.o fma_myri.o fma_myrioe.o fma_nic_cache.o fma_preset_routes.o fma_probe.o fma_proxy.o fma_raw_proxy.o fma_route.o fma_settings.o fma_standalone.o fma_sync_timer.o fma_tunnel.o fma_verify.o fma_resolve.o \
-DWHICHFMA=fma \
-lpthread ../libmyri/mx/libmyrimx.a ../libfma/libfma.a ../libdb/libdb.a /var/tmp/mx-1.2.9/libmyriexpress/user32/libmyriexpress.a \
-lsocket -lnsl -lrt
Von den Namen her könnte ich mir vorstellen das die gesuchten Symbole sich in libmyrimx.a verstecken. Da tut sich beim GNU Linker folgende fiese Falle auf:
The linker will search an archive only once, at the location where
it is specified on the command line. If the archive defines a
symbol which was undefined in some object which appeared before the
archive on the command line, the linker will include the
appropriate file(s) from the archive. However, an undefined symbol
in an object appearing later on the command line will not cause the
linker to search the archive again.
libmyriexpress.a taucht erst
nach libmyrimx.a auf. Als der Linker libmyrimx.a verarbeitet hat wusste er noch gar nicht das diese Symbole gebraucht werden.
Falls mx__writebar tatsächlich in libmyrimx.a vorhanden ist kannst Du mal versuchen es so hinzubiegen das libmyrimx.a nach libmyriexpress.a auf der Kommandozeile erwähnt wird. (Mehrfachnennungen sind kein Problem, manchmal sogar nötig um alle Abhängigkeiten aufzulösen)