Crosscompiling / Linker Probleme
-
Hallo,
ich versuche gerade eine Software unter Ubuntu 12.4. (64 Bit) für ein 32 Bit Zielsystem zu bauen. Soweit so gut, Compilerflags (-m32) sind gesetzt und Kompileren läuft auch ohne Probleme.
Nun werden aber ein paar Libraries benötigt, die ich mir als 32-Bit-Version auch per getlibs heruntergeladen habe. Im Makefile wird dem dann Rechnung getragen:
LDFLAGS += -s -m32 -L/usr/lib32/libblas -L/usr/lib32/lapack -L/usr/lib32/i386-linux-gnu -L/usr/lib32/i386-linux-gnu/i686/cmov -pthread LIBS += -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_calib3d -lblas -lespeak -llapack -lm -lprotobuf -lpthread -lrt -lz
Nun bekomme ich beim Linken dann solche Ausgaben, da die Libraries ihrerseits ja wieder andere Libraries benötigen:
/usr/bin/ld: warning: libavcodec.so.53, needed by /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib32/libopencv_highgui.so, not found (try using -rpath or -rpath-link) /usr/bin/ld: warning: libavformat.so.53, needed by /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib32/libopencv_highgui.so, not found (try using -rpath or -rpath-link)
Nun sind dieses Libraries aber eigentlich alle vorhanden, zumindestens im aufgeführten Fall:
cd /usr/lib32/i386-linux-gnu/i686/cmov /usr/lib32/i386-linux-gnu/i686/cmov$ ls -l | grep 'libav' lrwxrwxrwx 1 root root 21 Nov 9 12:07 libavcodec.so -> libavcodec.so.53.35.0 lrwxrwxrwx 1 root root 21 Nov 9 17:06 libavcodec.so.53 -> libavcodec.so.53.35.0 -rw-r--r-- 1 root root 7291052 Nov 9 17:06 libavcodec.so.53.35.0 lrwxrwxrwx 1 root root 22 Nov 9 12:08 libavformat.so -> libavformat.so.53.21.0 lrwxrwxrwx 1 root root 22 Nov 9 17:08 libavformat.so.53 -> libavformat.so.53.21.0 -rw-r--r-- 1 root root 1115980 Nov 9 17:08 libavformat.so.53.21.0
/usr/lib32$ ldd libopencv_highgui.so libavcodec.so.53 => /usr/lib32/i386-linux-gnu/i686/cmov/libavcodec.so.53 (0xf5dd2000) libavformat.so.53 => /usr/lib32/i386-linux-gnu/i686/cmov/libavformat.so.53 (0xf5cc0000)
/usr/lib32/i386-linux-gnu/i686/cmov$ file libavcodec.so.53.35.0 libavcodec.so.53.35.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xbfe5e90f5117803e4cd07b2fbd3c13937ba65bb0, stripped
Hat jemand ne Ahnung was ich machen könnte? Ich bin den Nerven ehrlich gesagt nach stundenlangen Rumfummeln ziemlich am Ende
-
Ok, nach weiterer Fummelei habe ich den Linker dazu gebracht die Libraries zu finden. Die Angabe als Linkeroption hat nicht ausgereicht, erst ein Eintrag in die Datei /etc/ld.so.conf.d/i386-linux-gnu_GL.conf hat Erfolg gezeigt. Ziemlich vertrackt alles.
Weiß jemand zufälligerweise, warum das exportieren von $LD_LIBRARY_PATH in der .bashrc keine Wirkung zeigt? Den Pfad zu den Librarys muss ich immer noch per -L einfügen, was ich sehr unschön finde.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib32/i386-linux-gnu:/usr/lib32/libblas/:/usr/lib32/lapack/
-
Der ganze Ansatz war leider für die Katz, da auf dem Zielsystem unter anderem eine andere libc drauf ist und die entsprechenden Libraries nicht funktionieren.
Jetzt versuche ich mit Hilfe von crosstools-ng einen Crosscompiler aufzusetzen und alles damit zu kompilieren
-
Und wenn du statisch verlinkst?
-
Naja, auf nem eingebetteten System wäre es halt unschön die ganzen Libraries (sind schon ein paar) statisch zu linken.