Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: sés en 13 de Febrero de 2005, 05:17:41 PM

Título: Problema Con Librería
Publicado por: sés en 13 de Febrero de 2005, 05:17:41 PM
 Ya no sé qué probar -.-... a ver si alguien sabe qué pasa.

Tengo un programa cualquiera (main.cpp) que tiene cualquier cosa, da igual.
Tengo otro (winmain.cpp) aparte que implemente WinMain().
Los compilo, los enlazo y funciona perfectamente.

Ahora bien, si en lugar de enlazar los dos .o, creo una librería estática con winmain.o y lo enlazo con main.o... NO FUNCIONA.

El error es este:
/mingw/lib/libmingw32.a(main.o)(.text+0x106):main.c: undefined reference to `WinMain@16'

He mirado los símbolos que contienen ambos archivos (el .o y el .a) y parecen idénticos:
>nm winmain.o

00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T _WinMain@16



>nm winmain.a

winmain.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T _WinMain@16


En fin... resumiendo.

Esto funciona:
>g++ -o main.exe main.o winmain.o

Esto no:
>g++ -o main.exe main.o winmain.a


Por si sirve de algo, la librería la creo así:
ar r winmain.a winmain.o
ranlib winmain.a
Título: Problema Con Librería
Publicado por: Zaelsius en 13 de Febrero de 2005, 05:31:06 PM
 Pues.. a mí me parece lógico ese error. El punto de entrada del programa *deberia* estar en el módulo principal, no en una libreria. Está claro que por poder, el compilador lo podria hacer, pero no le parece correcto.

Deberias cambiar el diseño para no tener que hacer eso :ph34r:
Título: Problema Con Librería
Publicado por: TheAzazel en 13 de Febrero de 2005, 06:18:51 PM
 Uhmm... no se no se... por poner un ejemplo, en SDL el winmain esta en la DLL.... y no hay ningun problema en hacerlo. Ahora, podria ser el compilador que da algun problemilla... no se, has utizado el google a ver?
Título: Problema Con Librería
Publicado por: Zaelsius en 13 de Febrero de 2005, 06:48:03 PM
 Ah, vale,.. fallo mio..  (rules)

¿Has probado a usar esto?
Citar
>g++ -o main.exe main.o -lwinmain

Las librerias se enlazan con la opción -l en Gcc, lo mismo es por eso.
Título: Problema Con Librería
Publicado por: TheAzazel en 13 de Febrero de 2005, 11:44:43 PM
 
Cita de: "ZaelSiuS"Ah, vale,.. fallo mio..  (rules)

¿Has probado a usar esto?
Citar
>g++ -o main.exe main.o -lwinmain

Las librerias se enlazan con la opción -l en Gcc, lo mismo es por eso.
Me da q eso podria ser (ole)  a ver cdo lo prueba Ses.... aunq yo he linkado contra librerias estaticas sin usar el paramentro -l... no se si ese, lo que le dice al compi es q busque la lib en el path de librerias o en /usr/lib...

por cierto, se sale un poco del tema pero.... q tal esta el GNU C para entornos Windows? es q si genera buen codigo.... lo mismo empiezo a usarlo. Aunque creo que de los mejorcitos es el de Intel.
Título: Problema Con Librería
Publicado por: Zaelsius en 14 de Febrero de 2005, 12:02:17 AM
 Acabo de mirar el manual de GCc y he vuelto a meter la pata XDD... este es mi post maldito :ph34r:
Título: Problema Con Librería
Publicado por: TheAzazel en 14 de Febrero de 2005, 12:33:45 AM
 ¿seguro Zaelsius? mira que yo creo q pueden ir por ahi los tiros... aun no es tu post maldito jeje.

Ses, he encontrado esto por ahi:

The only trick in getting this to compile now is to add the include path (eg: -I../SDL/include), the linker path (eg: -L../SDL/lib), and then finally adding the libraries themselves in the right order. Use:

-lmingw32 -lSDLmain -lSDL

Also, don't forget to add the -mwindows flag, if your IDE doesn't add it automatically (in addition to whatever other libraries you want to link). If you don't put them in the right order, you'll get a linker error complaining about the missing symbol WinMain@16.


es la forma de compilar contra SDL(q tambien tiene el winmain en la dll),  espero que te sea util, un saludo
Título: Problema Con Librería
Publicado por: sés en 14 de Febrero de 2005, 10:29:44 AM
 Ya lo tengo... :)
Gracias a todos por vuestra ayuda.

[inciso]
Lo de enlazar con -lXXX solo es una forma abreviada para librerías que se llamen libXXX.a
[/inciso]

El fallo estaba precisamente en la ventaja de las librerías ^_^' (que cabeza la mía).

Cuando enlazas con una librería, realmente solo se enlazan los objetos que contienen SI SE UTILIZAN. O sea, que al no llamar directamente a WinMain(), mi winmain.o (dentro de la librería) no se enlazaba.
Por eso sí funcionaba al enlazar directamente el fichero winmain.o

La solución está en obligar a se enlace siempre ese objeto. Yo lo he hecho declarando una variable que siempre se utilizará... ¿hay alguna forma mejor de hacerlo?