Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Librería

Iniciado por sés, 13 de Febrero de 2005, 05:17:41 PM

« anterior - próximo »

sés

 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
Soy indeciso... ¿o no?

Zaelsius

 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:

TheAzazel

 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?

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.

TheAzazel

 
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.

Zaelsius

 Acabo de mirar el manual de GCc y he vuelto a meter la pata XDD... este es mi post maldito :ph34r:

TheAzazel

 ¿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

sés

 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?
Soy indeciso... ¿o no?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.