PDA

View Full Version : linux,shared objects.


Mason
05-05-2003, 15:40
allora io sto svilupando la mia tesi sotto linux in opengl,e per famrmi aprire una finestra fs ho fatto un brutale taglia incolla da un tutorial che ho trovato in giro(nehe).

su un pc ho gentoo e su un altro rh8.su uno xfree4.2 e su gentoola 4.3.

ieri il pc con gentoo mi molla allora passo a rh,e qui iniziano i prob.

se cerco di far partire un a.out su rh mi dice che manca un shared object, lo cerco in lib ed effetivamente non c'e....

allora cerco di eseguire un tutorial di nehe,nisba anche quello, anche li mi manca un shared obj.

cancello l'eseguibile e rilancio il suo make

lo compila e funge.

provo sul mio
ricompilo il mi il linker mi dice che non risolve delle referenze.

vi faccio vedere i vari output:

//sezione nehe

[root@master lesson02]# ldd lesson02
libGL.so.1 => /usr/lib/libGL.so.1 (0x40025000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0x40073000)
libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x400ef000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x400fd000)
libGLcore.so.1 => /usr/lib/libGLcore.so.1 (0x401db000)
libm.so.6 => /lib/i686/libm.so.6 (0x4066d000)
libdl.so.2 => /lib/libdl.so.2 (0x40690000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40693000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40745000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

[root@master lesson02]# cat Makefile
CC = gcc -Wall -pedantic -ansi

all:
$(CC) lesson02.c -o lesson02 -L/usr/X11R6/lib -lGL -lGLU -lXxf86vm

clean:
@echo Cleaning up...
@rm lesson02


//sezione mio prg

[root@master src]# ldd tesi
libXpm.so.4 => /usr/X11R6/lib/libXpm.so.4 (0x40025000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0x40035000)
libGL.so.1 => /usr/lib/libGL.so.1 (0x400b1000)
libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x400fe000)
libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x40107000)
libXmu.so.6 => /usr/X11R6/lib/libXmu.so.6 (0x4011e000)
libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x40134000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40187000)
libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x40195000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4019d000)
libdl.so.2 => /lib/libdl.so.2 (0x4027b000)
libpthread.so.0 => /lib/i686/libpthread.so.0 (0x4027e000)
libXxf86vm.so.1 => not found
libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x402af000)
libm.so.6 => /lib/i686/libm.so.6 (0x40361000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40383000)
libGLcore.so.1 => /usr/lib/libGLcore.so.1 (0x4038b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

compiklato con

g++ -c *.cpp
gcc -L/usr/X11R6/lib -lGL -lGLU -lXxf86vm *.o

errore gcc/linker

[root@master src]# gcc -L/usr/X11R6/lib -lGL -lGLU -lXxf86vm *.o
screen.o: In function `MasScreen::killGLScreen()':
screen.o(.text+0x72): undefined reference to `XF86VidModeSwitchToMode'
screen.o(.text+0x89): undefined reference to `XF86VidModeSetViewPort'
screen.o: In function `MasScreen::createGLScreen(char*, int, int, int)':
screen.o(.text+0xf0): undefined reference to `XF86VidModeQueryVersion'
screen.o(.text+0x10b): undefined reference to `XF86VidModeGetAllModeLines'
screen.o(.text+0x26f): undefined reference to `XF86VidModeSwitchToMode'
screen.o(.text+0x286): undefined reference to `XF86VidModeSetViewPort'
collect2: ld returned 1 exit status

suggerimenti consigli aiuti?

ilsensine
05-05-2003, 16:12
libXxf86vm.so.1 => not found
Su diversi sistemi questa libreria è disponibile in formato archivio statico (.a)



[root@master src]# gcc -L/usr/X11R6/lib -lGL -lGLU -lXxf86vm *.o
screen.o: In function `MasScreen::killGLScreen()':
screen.o(.text+0x72): undefined reference to `XF86VidModeSwitchToMode'

Quei simboli non risolti appartengono proprio a quella libreria. Prova a includere il path completo come se fosse un .o normale:
gcc -L<...> -lGLU -lGL *.o /usr/X11R6/lib/libXxf86vm.a
Strano che con -lXxf86vm non prenda da solo il .a ...

ilsensine
05-05-2003, 16:15
In alternativa puoi creare il .so dal .a; esegui questi comandi da root da dentro la directory /usr/X11R6/lib:

ld -shared --whole-archive libXxf86vm.a -o libXxf86vm.so.1 -L /usr/X11R6/lib -lX11 -lXext
ln -s libXxf86vm.so.1 libXxf86vm.so
ldconfig

Mason
05-05-2003, 16:22
thx mille sensi
non e stato necessario creare il .so ma e bastato metterlo come argomento al gcc,come da e consigliato in primis.

grazie anche per il 2 consiglio,molto utile,io avevo provato con un ar