2010-11-29 5 views
6

Estoy en linux. Mi archivo Makefile es este¿Cómo puedo vincular y crear una biblioteca de enlaces dinámicos correctamente?

main2: main.cpp 
g++ -c $(LIBS) $(CFLAGS) -fPIC main.cpp 
g++ -shared main.o -o main.so 

Cuando,

SDL_CFLAGS := $(shell sdl-config --cflags) 
SDL_LDFLAGS := $(shell sdl-config --libs) 
CC = gcc 
COPTS = -g -Wall 
CFLAGS = $(SDL_CFLAGS) 
LIBS = -lstdc++ -lSDL $(SDL_LDFLAGS) -L/usr/X11R6/lib -lGL -lGLU 

que corre

g++ -c -lstdc++ -lSDL -L/usr/lib -lSDL -L/usr/X11R6/lib -lGL -lGLU -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -fPIC main.cpp 

g++ -shared main.o -o main.so 

Ahora, esto funciona sin errores. main.o y main.so archivos son producidos.

Sin embargo, cuando intento conectar con main.os ctypes pitón

from ctypes import * import os 
libtest = cdll.LoadLibrary(os.getcwd()+ '/main.so') libtest.main_loop() 
libtest.main_loop() 

consigo este error

>>> libtest = cdll.LoadLibrary(os.getcwd() + '/main.so') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
OSError: /home/atomos/DF/open_gl_client/ctypes_client/main.so: undefined symbol: glEnd 

No estoy seguro de si estoy creando la biblioteca vinculada correctamente. ¿Cómo creo una biblioteca vinculada que pueda cargar?

¿Tengo que crear un archivo .o y .os para cada biblioteca que importo de main.cpp o me ocupo de eso automáticamente?

No entiendo lo que hace el compilador o el enlazador, sin embargo, funciona para un ejemplo simple sin importación, pero para los archivos cpp que importan bibliotecas OpenGL, da ese error.

---- ---- Actualización ldd contra main.so rendimientos

ldd main.so 
     linux-gate.so.1 => (0xb7755000) 
     libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xaf625000) 
     libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xaf5ff000) 
     libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xaf4a4000) 
     libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xaf485000) 
     /lib/ld-linux.so.2 (0xb7756000) 

---- ---- Actualización

me encontré g ++ sin bandera -shared en el segundo paso de compilación y recibió este error

g++ main.o -o main.so 
main.o: In function `Texture_map_list::add_texture(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)': 
main.cpp:(.text+0xf0fe): undefined reference to `glGenTextures' 
main.cpp:(.text+0xf2ba): undefined reference to `glBindTexture' 
main.cpp:(.text+0xf2d7): undefined reference to `glTexParameterf' 
main.cpp:(.text+0xf2f4): undefined reference to `glTexParameterf' 
main.cpp:(.text+0xf310): undefined reference to `glTexParameteri' 
main.cpp:(.text+0xf32c): undefined reference to `glTexParameteri' 
main.cpp:(.text+0xf365): undefined reference to `gluBuild2DMipmaps' 
main.o: In function `init()': 
main.cpp:(.text+0xf457): undefined reference to `SDL_Init' 
main.cpp:(.text+0xf46d): undefined reference to `SDL_WM_SetCaption' 
main.cpp:(.text+0xf472): undefined reference to `SDL_GetVideoInfo' 
main.cpp:(.text+0xf480): undefined reference to `SDL_GetError' 
main.cpp:(.text+0xf497): undefined reference to `SDL_Quit' 
main.cpp:(.text+0xf4e2): undefined reference to `SDL_GL_SetAttribute' 
main.cpp:(.text+0xf505): undefined reference to `SDL_SetVideoMode' 
main.cpp:(.text+0xf513): undefined reference to `SDL_GetError' 
main.cpp:(.text+0xf52a): undefined reference to `SDL_Quit' 
main.cpp:(.text+0xf559): undefined reference to `glClearColor' 
main.cpp:(.text+0xf565): undefined reference to `glEnable' 
main.cpp:(.text+0xf571): undefined reference to `glMatrixMode' 
main.cpp:(.text+0xf576): undefined reference to `glLoadIdentity' 
main.cpp:(.text+0xf5a2): undefined reference to `gluPerspective' 
main.o: In function `process_keypresses()': 
main.cpp:(.text+0x10678): undefined reference to `SDL_PollEvent' 
main.cpp:(.text+0x109a1): undefined reference to `SDL_PollEvent' 
main.o: In function `main_loop': 
main.cpp:(.text+0x10d76): undefined reference to `SDL_GetKeyState' 
main.cpp:(.text+0x10d9f): undefined reference to `SDL_Quit' 
main.o: In function `render()': 
main.cpp:(.text+0x10e00): undefined reference to `SDL_GetMouseState' 
main.cpp:(.text+0x10e90): undefined reference to `SDL_GetMouseState' 
main.cpp:(.text+0x10f94): undefined reference to `glClear' 
main.cpp:(.text+0x10fa0): undefined reference to `glMatrixMode' 
main.cpp:(.text+0x10fa5): undefined reference to `glLoadIdentity' 
main.cpp:(.text+0x11081): undefined reference to `gluLookAt' 
main.cpp:(.text+0x11120): undefined reference to `glTranslatef' 
main.cpp:(.text+0x1114d): undefined reference to `glRotatef' 
main.cpp:(.text+0x1117a): undefined reference to `glRotatef' 
main.cpp:(.text+0x1119e): undefined reference to `SDL_GL_SwapBuffers' 
main.o: In function `draw_plane(float, float, float)': 
main.cpp:(.text+0x111d8): undefined reference to `glColor3f' 
main.cpp:(.text+0x111e4): undefined reference to `glBegin' 
main.cpp:(.text+0x1120b): undefined reference to `glVertex3f' 

....

+0

"archivo de compilación" - Creo que quieres decir * Makefile *. –

Respuesta

11

En primer lugar, cabe destacar que thi s es más fácil de depurar si no compila una biblioteca compartida. Está compilando con -share para que los errores del enlazador no ocurran hasta que cargue dinámicamente la biblioteca en Python. Apaga -shared mientras depura, y verá los errores en la línea de comandos cuando intenta enlace:

g++ main.o -o main 
main.o: In function `main': 
main.cpp:(.text+0x1d): undefined reference to `glBegin' 
main.cpp:(.text+0x22): undefined reference to `glEnd' 
collect2: ld returned 1 exit status 

Ahora el problema es que va a pasar argumentos del enlazador al compilador. Veo que tiene muy bien separados CFLAGS y LIBS en el archivo Makefile. Bueno. Pero está pasando $(LIBS) y $(CFLAGS) en la primera línea, para compilar main.o. El LIBS se ignorará en esa línea, porque son marcadores de enlace.

En la segunda línea, donde está realmente construyendo el ejecutable final, no pasa $(LIBS), por lo que el programa no está vinculado con libGL o cualquier otra biblioteca.

Por lo tanto, sólo tiene que arreglar su makefile así:

main2: main.cpp 
    g++ -c $(CFLAGS) -fPIC main.cpp 
    g++ -shared main.o $(LIBS) -o main.so 

Editar: he dado cuenta de que ya en GCC, debe always put the libraries after the object files, así que he cambiado la última línea del archivo MAKE en consecuencia.

+0

Esto solucionó el problema. Gracias. – HaltingState

+5

Genial para escuchar. ¿Puedes marcar la casilla de verificación 'respuesta aceptada' para marcar esto como resuelto? Gracias. – mgiuca

+0

Toco la casilla de respuesta aceptada y upvoted. Lo siento, me olvidé de hacer eso. – HaltingState

1

simple:

Usted está de paso los enlazado a oponerse paso de compilación.

Aquí es lo que necesita:

g++ -c -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT main.cpp 
g++ -lstdc++ -lSDL -L/usr/lib -lSDL -L/usr/X11R6/lib -lGL -lGLU -fPIC main.o -o main 

Plus es probable que no desea crear así un archivo, sino un ejecutable normal.

+0

Bueno, él sí quiere crear un archivo así, ya que lo está importando a Python. – mgiuca

Cuestiones relacionadas