Compilando DLL’s en Linux!
Pues hemos estado indagando un poco en el asunto de que el IDE no nos dejara compilar DLL’s en linux y hemos encontrado la solución a este temita que nos tenía mosqueados.
El primer error que cometíamos era indicar en las opciones del proyecto que nos compilara solamente para la plataforma Windows. Debíamos dejarlo como estaba, para todas las plataformas (Unix, Mac y Windows).
Hecho esto, tanto el ejecutable como la DLL compilan perfectamente. La sorpresa es que el ejecutable aparece sin la extensión característica (.exe) y la DLL sin la suya (.dll). Esto es lo que nos hizo comer la olla y liarnos en el tema de toquetear las opciones del proyecto. Que el ejecutable era para windows no había duda, pues lo abriamos con Wine y voilá, lo corría perfectamente. El tema era la dll, que nos la daba con extension .so. Nos ha hecho sospechar que el ejecutable funcione para Windows a pesar de la no-extensión y de la compilación “multiplataforma”, y supuestamente el DLL no debería de funcionar. El caso es todo el contrario, hemos puesto una bonita extension .dll a nuestra DLL de prueba, y hemos exportado la función que habia dentro al ejecutable y… sí! Funciona perfectamente! Problema solucionado!
Aquí os dejo el código de los programas de prueba, por si alguien le interesa.
Ejecutable:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>int main()
{
/*Definimos el tipo para la funcion a exportar*/
typedef void (*pfunc)();/*Hande de windows*/
HANDLE hdll;/*El puntero a la funcion*/
pfunc HelloDllFunc;/*Cargamos la libreria con LoadLibrary*/
hdll = LoadLibrary(“HelloWorld.dll”);/*Obtenemos la dirección de la funcion a utilizar con GetProcAddress*/
HelloDllFunc = (pfunc)GetProcAddress(hdll, “printHelloWorld”);/*Llamamos a la funcion*/
HelloDllFunc();/*Paramos la ejecucion con un getch, de la libreria conio.h*/
getch();return 0;
}
DLL:
#include <stdio.h>
//Funcion de la dll que imprime por pantalla “Hello World!” 4 veces
void printHelloWorld()
{
int i;
for (i=0; i<4;i++){
fprintf(stdout, “Hello World!\n\n”);
}
}
Como veis el código está bien comentado así que deberíais entenderlo fácilmente. Sino siempre nos podéis preguntar. Si preferís que subamos el tarball con los proyectos de Code::Blocks pedidlo y lo subiremos a un Rapidshare, Megaupload o algo parecido.
Por cierto, también os dejo el link del HOWTO para configurar el Code::Blocks para compilar para Windows:
http://forums.codeblocks.org/index.php?topic=3343.0
Pues nada, a continuar trabajando! Esperamos que le sirva de ayuda a alguien esto también!

Loading...
Diría que la librería conio no es una librería bajo licencia GPL, con lo que no es libre del todo el programa escrito por vosotros…
¡¡¡Por cierto, a ver si tira para adelante este proyecto ya que es muy bueno!!!
oscar - Noviembre 25, 2008 at 12:04 pm
Pues ahora mismo no se si es libre o no, pero esto no forma parte del proyecto en si, tan solo es una prueba (Hello World) para mirar que realmente lo que compilamos fuera una DLL y ya de paso tomar contacto con las exportaciones en tiempo de ejecución.
Aun así, ahora me has dejado con la intriga.. ya buscaré
zlowram - Noviembre 25, 2008 at 1:01 pm
Estoy intentando crear librerias de 1proyecto en C++ en Ubuntu,y quisiera hacerlo simplemente con el mingw32 o directamente con g++ si se pudiera,si pudieras mandarme al mail ayuda o mostrar algun enlace de probecho, lo agradeceira muxiiiiisimo, puesto que llevo ya un tiempo atascado probando cosas sin avanzar a penas.
Tngo varios ejemplos d kodigo como el q abeis kolgao,lo q no konsigo es crear la DLL (nose como) los ejecutables bien.
Gracias.
In0t_ - Diciembre 9, 2008 at 11:04 am
Buenas In0t_
El hecho de usar el mingW32 o el g++ depende de la plataforma para la que quieras compilar la libreria. Si es para windows: mingw32, si es para plataforma linux o unix: g++. Deduzco que si pides una DLL sera para windows (también hay librerias dinámicas para linux, las *.so). Te recomendaria que usases el IDE code::blocks, ya que te permitira el cross-compiling (compilar para otras plataformas distintas a la que usas para compilar). Para configurar-lo usa el enlace que hay en el post. Con eso deberias tener suficiente para poder compilar tu DLL. Para utilizarla en tu ejecutable (no se si también preguntas eso) ya es otra cosa. Espero que te sea de ayuda.
zlowram - Diciembre 9, 2008 at 8:14 pm
¿cuándo dices unix a que te refieres?
deltafinger - Diciembre 11, 2008 at 4:50 pm