Gracias Gracias:  0
Me Gusta Me Gusta:  0
No me Gusta No me Gusta:  0
Página 1 de 2 12 ÚltimoÚltimo
Mostrando resultados del 1 al 10 de 11

Tema: ¿Como compilar libreria para ser usada tanto con gcc y g++?

  1. #1
    Fecha de Ingreso
    13-agosto-2005
    Mensajes
    12
    Post Thanks / Like
    Poder de Credibilidad
    0

    ¿Como compilar libreria para ser usada tanto con gcc y g++? [Solucionado]

    Hola a todos!!

    Pues el titulo lo dice casi todo...

    Mi duda es como puedo generar una librería estática (o dinámica) que pueda utilizar tanto con gcc y con g++, así como la libreria math entre muchas otras.
    La idea es escribir la librería en ansi C compilarla con gcc, y posteriormente usarla en un programa escrito en C++ el cual se compilará con g++. Obviamente que la librería también pueda ser usada con otro programa escrito en C.

    Mi motivación

    Estoy realizando un proyecto donde requiero procesamiento en tiempo real, por lo cual estoy exagerando (en la medida de mis posibilidades y pocos conocimientos) la optimización de mi programa. He leido acerca de que un programa escrito en ansi C es más rápido que uno escrito en C++, por lo que quiero creer que si compilo el núcleo de mi programa en ansi C (funciones más importantes), y el esqueleto del mismo en C++, obtendré lo mejor de los dos mundos, por un lado rapidez, y por el otro la flexibilidad del C++ (sin contar que algunas librerías que utilizo solo están disponibles en C++).
    Corríjanme por favor si en esto último estoy equivocado.....

    Algo que hice pero no creo que sea lo correcto, ni satisface mi objetivo

    En el proceso de investigar este problema y experimentar algunas cosas, se me ocurrió hacer lo siguiente, obteniendo aparentemente buenos resultados, pero como ustedes verán, no logré mi objetivo primordial..

    tengo un archivo de código fuente funciones.c y su respectivo funciones.h y hago lo siguiente:

    /* compilo con gcc quedándome funciones.o*/
    gcc -c funciones.c

    /*compilo ahora con g++ el mismo código fuente, pero ahora con salida en funciones2.o */
    g++ -c -o funciones2.o funciones.c

    /*Empaqueto los dos objetos y genero la librería estática, luego se genera su indice */
    ar -rv libfunciones.a funciones.o funciones2.o
    ranlib libfunciones.a

    De esta manera logro enlazar cualquier programa escrito en C o C++ usando la librería funciones, pero como pueden ver en realidad lo único que hago es generar un objeto para C y otro para C++, asi que cuando lo utilizo en un programa escrito en C++, realmente estoy tomando un código compilado con g++ que es lo que yo no quiero.

    Agradezco de antemano sus comentarios

    Salu2
    Última edición por Ulises; 23-mar-2008 a las 07:35

  2. #2
    Fecha de Ingreso
    22-febrero-2007
    Ubicación
    Valladolid- España
    Mensajes
    591
    Post Thanks / Like
    Poder de Credibilidad
    13
    C y C++ son cosas parecidas pero no iguales. C es un lenguaje de programacion secuencial (o lineal, segun los gustos de la gente), mientras que C++ es un lenguaje de programacion orientado al objeto. Dos conceptos de programacion bastante distintos. C++ usa muchas caracterisitcas parecidas a las de C, pero no iguales. Has comentado el ejemplo de la libreria math. Si abres la libreria math de C y la de C++ veras que son distintas. Una esta declarada como funciones y otra como metodos, que no es lo mismo.

    Es algo muy interesante lo que dices, lo de generar una libreria que sea comun tanto para C como para C++. Personalmente desconozco si se podra hacer, pero partiendo de que son conceptos de programacion muy distintos, no creo que se pueda hacer.

    Si me equivoco corregidme. Me interesa este tema, me parece muy interesante. Estare muy atento a los comentarios de los demas aforados.

  3. #3
    Fecha de Ingreso
    19-octubre-2006
    Mensajes
    517
    Post Thanks / Like
    Poder de Credibilidad
    13
    Creo que te puedo dar una pista, pero no se muy bien como funciona. C++ tiene dos mecanismos que facilitan su enlace con otros lenguajes. Uno de ellos es la palabra clave asm, que incluye en el código fuente de C++ instrucciones en asm, contracción inglesa de assembler y que en nuestro idioma se traduce como Ensamblador. El otro es especificador de enlace, que indica al programa en C++ que una o más funciones del programa se enlazarán con otro lenguaje.

    Básicamente para enlazar con C se haría de la siguiente forma:

    extern "C" Prototipo de la función;

    extern "C" {

    Prototipo de la función 1;
    Prototipo de la función 2;
    }
    Los prototipos de estas funciones pueden enlazarse con código compilado mediante un compilador de C.


    Todo esto lo he sacado de un libro de C++ que estoy leyendo, pero nunca lo he usado. Ahora hice una serie de pruebas, pero creo que no lo hice bien o que no se lo suficente acerca de mi compilador (gcc no entendido como gnu c compiler si no como gnu compiler colection, es decir, gcc, g++, gfortran....). Te muestro dos ficheros de código fuente que compilar correctamente cada uno en su compilador:

    test.c

    Código:
    int calcMitad(int x)
    {
         return x/2;
    }
    main.cc

    Código:
    #include <iostream>
    extern "C" calcMitad(int x);
    #include "test.c"
    
    int main()
    {
        std::cout << calcMitad(6) << std::endl;
        return 0;
    }
    Cuando ejecuto en consola:

    gcc test.c -o test.o
    g++ main.cc -o main.o
    g++ main.o test.o -o testApp

    Todo va bien hasta que ejecuto el último paso que me salen varios errores del compilador. En cambio, si ejecuto:

    g++ main.cc -o testApp

    testApp se ejecuta correctamente, pero si incluyo código en C++ compila igualemente, cosa que no debería hacer, según creo.

    Bueno espero que investigando encuentres algo, y si lo haces avisa en el foro, que también me parece muy interesante y me gustaría aprender a hacerlo bien.

    Un saludo

  4. #4
    Fecha de Ingreso
    22-febrero-2007
    Ubicación
    Valladolid- España
    Mensajes
    591
    Post Thanks / Like
    Poder de Credibilidad
    13
    Interesante lo que comentas del asm. Me acuerdo que lo use en mis practicas de ensamblador de Ultrasparc. Programabamos en ensamblador y luego lo transformabamos a codigo c a traves de asm, para despues compilar y ejecutar en C. Este lio de traducciones se debe a que no teniamos permisos suficientes en las estaciones SUN como para compilar en ensamblador.

    Ulises invenstiga por ese camino, que es posible que encuentres algo. Eso si, la cosa se complica. Ahora tienes que programar en ensamblador. Mejor cambia de proyecto, jejejeje.

  5. #5
    Fecha de Ingreso
    07-julio-2006
    Ubicación
    Málaga...por poco tiempo!!
    Mensajes
    2.151
    Post Thanks / Like
    Poder de Credibilidad
    16
    Cita Iniciado por Theseo
    Ahora tienes que programar en ensamblador. Mejor cambia de proyecto, jejejeje.
    Pero si el ensamblador es relindo! xD Yo he tenido que programar las instrucciones basicas de la CPU que hemos diseñado y como practica y es precioso! xDDD

    How-to VirtualBox <~ Guía sobre VirtualBox

  6. #6
    Fecha de Ingreso
    19-octubre-2006
    Mensajes
    517
    Post Thanks / Like
    Poder de Credibilidad
    13
    Creo que se puede programar en C no tiene que ser necesariamente en ensamblador con la segunda de las dos opciones. Si el enlazado lo haces a través de la palabra clave asm si que tiene que ser ensamblador, pero en cambio extern, por lo que he leído, soporta C.

    Un saludo.

    P.D.: Voy a iniciar mis propias pesquisas para ver como se puede hacer eso.

    EDITO: Creo que mis pesquisas han dado éxito:

    http://www.parashift.com/c++-faq-lit....html#faq-32.6
    http://developers.sun.com/sunstudio/...es/mixing.html

    Mañana intentaré programar algo y que funcione.
    Última edición por hormigaz; 19-jun-2007 a las 23:10

  7. #7
    Fecha de Ingreso
    13-agosto-2005
    Mensajes
    12
    Post Thanks / Like
    Poder de Credibilidad
    0

    Exito

    Hola amigos!!

    ¡¡¡¡Ya funcionó!!!!

    Muchas gracias hormigaz!!!!! llevaba días y nunca se me ocurrió buscar como "mixing c and c++"

    Por cierto, leí algo que incrementó mi curiosidad..... en uno de los links dice:

    If you are including a C header file that isn't provided by the system, you may need to wrap the #include line in an extern "C" { /*...*/ } construct. This tells the C++ compiler that the functions declared in the header file are C functions.
    es decir, cuando son librerías que vienen con el sistema no es necesario el código que se tiene que agregar cuando es una librería personal....

    ¿cual es la diferencia en este caso de una librería de sistema (como math, stdio y algunas otras) con las que nosotros creamos?

    tendré que investigarlo, aunque por lo pronto me urge terminar mi proyecto y lo que quería ya lo logré, lo usaré sin más preguntas... jejejeje

    Por cierto Theseo, no se me había ocurrido la idea de generar cierto código en ensamblador, creo que eso puede hacer que mi programa se acelere más. Muchas gracias por la idea!!!

    Salu2
    Última edición por Ulises; 21-jun-2007 a las 03:17

  8. #8
    Fecha de Ingreso
    13-agosto-2005
    Mensajes
    12
    Post Thanks / Like
    Poder de Credibilidad
    0

    Así logré hacerlo funcionar

    Pues bien, como lo prometí, pongo aquí un código de ejemplo basado en lo que propone hormigaz, y como compilarlo para que funcione:

    Hay dos formas para lograr el objetivo, sin embargo voy a poner aquí la opción recomendada en las páginas proporcionadas anteriormente...

    se tienen 3 archivos , main.cpp, test.c y test.h, los cuales pongo a continuacion:

    test.c

    Código:
    float calcMitad(int x)
    {
         return x/2;
    }
    test.h

    Código:
    #ifndef _TEST_H       //  directivas de preprocesador estandares
    #define _TEST_H       
    
    //------------------------------------------------------------------
    #ifdef __cplusplus      //  Estas tres lineas
    extern "C" {              //  son parte de lo que 
    #endif                     //  nos permite usar nuestro código en c y c++
    // ------------------------------------------------------------------
    
    
    float calcMitad(int x);     // Declaración de nuestras funciones
    
    //------------------------------------------------------------------
    #ifdef __cplusplus       // estas tres lineas deben cerrar
    }                              // las directivas de arriba
    #endif
    //------------------------------------------------------------------
    
    #endif                     // directiva que cierra el ifndef principal
    y finalmente el archivo main.cpp

    Código:
    #include <iostream>
    #include "test.h"
    
    using namespace std;
    
    int main()
    {
        cout << calcMitad(6) << endl;
        return 0;
    }
    con los tres archivos en la misma carpeta, procedemos a compilar de la siguiente manera:
    Código:
    gcc -Wall -c test.c
    nótese el uso de la opción -c la cual le indica al compilador que se detenga en el paso de la generación del código objeto. De la misma manera pero ahora usando g++ compilamos el archivo main.cpp
    Código:
    g++ -Wall -c main.cpp
    Los dos pasos anteriores nos generan los archivos objeto test.o y main.o respectivamente. Ahora para ligarlos y generar nuestro ejecutable simplemente ejecutamos en consola:
    Código:
    g++ test.o main.o  -o prueba
    Y listo, en unos cuantos instantes tendremos nuestro archivo "prueba" ejecutable el cual ya podremos usar.

    Espero que este ejemplo le sirva a alguien mas. Cualquier duda, no duden en hacerla saber, en la medida de mis posibilidades intentaré resolverla.

    Salu2
    Última edición por Ulises; 21-jun-2007 a las 03:47

  9. #9
    Fecha de Ingreso
    22-febrero-2007
    Ubicación
    Valladolid- España
    Mensajes
    591
    Post Thanks / Like
    Poder de Credibilidad
    13
    Felicidades Ulises. Muy buen trabajo. Has echo simple algo que parecia complejo. Ya nos contaras que tal el proyecto.

  10. #10
    Fecha de Ingreso
    19-octubre-2006
    Mensajes
    517
    Post Thanks / Like
    Poder de Credibilidad
    13
    La verdad es que si que es sencillo como lo has hecho. Ya nos contaras que tal te fue con el proyecto.

    Un saludo

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Temas Similares

  1. Respuestas: 7
    Último mensaje: 07-nov-2012, 00:53
  2. diario de instalación de Opensuse 10.2 x86_64
    By karlggest in forum Instalación y Actualizaciones
    Respuestas: 6
    Último mensaje: 22-may-2008, 01:13
  3. Respuestas: 7
    Último mensaje: 18-feb-2007, 16:56
  4. Respuestas: 0
    Último mensaje: 15-feb-2005, 18:24
  5. Problema al compilar para KDE
    By Tomahawk in forum Escritorios: KDE, Gnome, otros...
    Respuestas: 2
    Último mensaje: 22-ene-2005, 07:19

Marcadores

Normas de Publicación

  • No puedes crear nuevos temas
  • No puedes responder mensajes
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •