Voy a utilizar un programa de análisis de datos para un experimento de física. Yo no puedo ponerme a compilar sin embargo.

El código es viejo, no es realmente compatible con los actuales GCC-versiones de lo que puedo encontrar. Para hacer las cosas un poco más de tiempo en consultas, me dieron el código de un chico que había modificado todos los archivos makefile para que se compile en Mac. No tengo C++-experiencia, pero con el hombre-páginas, Google y paciencia me han corregido muchos errores en el camino, pero estoy atascado en este, incluso después de una semana de intentos y googlear.

Creo que el correspondiente mensaje de error es el siguiente:

/usr/bin/ld: error in /home/daniel/skola/exjobb/miniballscripts
/lib/libCommandLineInterface.so(.eh_frame); no .eh_frame_hdr table will be created.`

Lo que puede ser la causa, y lo que puede ser el remedio?

libCommandLineInterface.so fue compilado por mí antes de que, sin aparente mensajes de error:

$ make  
g++ -g2 -O2 -I./ -c CommandLineInterface.cc -o CommandLineInterface.o  
g++ -g  -Wl -o /home/daniel/skola/exjobb/miniballscripts/lib/libCommandLineInterface.so
CommandLineInterface.o -lm -L/home/daniel/skola/exjobb/miniballscripts/lib -lgcc -lc  
Done

Mi g++-versión g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3, amd64.

Como ya he dicho, yo no tengo experiencia con C++, así que tal vez mi ingenuo Makefile modificaciones han destruido algo. Mi falta de experiencia, también me hace no saber realmente qué otra información es necesaria para ayudar a mí, pero estaré encantado de responder.

OriginalEl autor Daniel Andersson | 2010-09-12

3 Comentarios

  1. 3

    Parece que se han olvidado de la -shared opción de línea de comandos a la hora de generar el libCommandLineInterface.so archivo. Eso explicaría los múltiples errores de definición. Si el enlazador piensa que el archivo que se está generando es un archivo ejecutable (en lugar de una biblioteca dinámica), es el enlace en el código de inicio, etc. Cuando intenta utilizar este .así de archivo, los símbolos que vienen desde el código de inicio va a entrar en conflicto con aquellos que se añaden al archivo ejecutable que utiliza la biblioteca dinámica.

    Es posible que el libTransfer.por lo que los errores están relacionados con la misma bandera que se omite. Una biblioteca compartida que se le permite tener referencias pendientes (que se resuelven cuando la biblioteca se utiliza), pero un ejecutable tiene que tener todos los símbolos se resuelve en tiempo de vínculo. Esta es, probablemente, una simplificación de cómo son las cosas, pero yo nunca se necesitan para entrar en más detalles sobre la vinculación dinámica en linux. 🙂 De todos modos, la adición de -shared opción puede resolver la referencia indefinida errores así.

    Muchas gracias, necesitaba agregar -fPIC y compartida para el comando del compilador para libCommandLineInterface.so. Ahora estoy un paso más cerca de mi objetivo 🙂
    Olvidé mencionar: no fijar el indefinido referencias, pero hizo que el eh_frame_hdr-error desaparece.

    OriginalEl autor vhallac

  2. 1

    Los errores de vinculación de la preocupación de inicio con:

    [...]/lib/libCommandLineInterface.so: In function `_start':
    (.text+0x0): multiple definition of `_start'
    /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): first defined here
    [...]/lib/libCommandLineInterface.so: In function `_fini':
    (.fini+0x0): multiple definition of `_fini'
    /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crti.o:(.fini+0x0): first defined here
    [...]/lib/libCommandLineInterface.so:(.rodata+0x0): multiple definition of `_IO_stdin_used'
    /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata.cst4+0x0): first defined here
    [...]/lib/libCommandLineInterface.so: In function `__data_start':
    (.data+0x0): multiple definition of `__data_start'
    /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o:(.data+0x0): first defined here
    [...]/lib/libCommandLineInterface.so: In function `__data_start':
    (.data+0x8): multiple definition of `__dso_handle'
    /usr/lib/gcc/x86_64-linux-gnu/4.4.3/crtbegin.o:(.data+0x0): first defined here
    [...]/lib/libCommandLineInterface.so: In function `_edata':
    (*ABS*+0x607130): multiple definition of `__bss_start'
    [...]/lib/libCommandLineInterface.so: In function `_end':
    (*ABS*+0x6073b8): multiple definition of `_end'
    [...]/lib/libCommandLineInterface.so: In function `_edata':
    (*ABS*+0x607130): multiple definition of `_edata'
    [...]/lib/libCommandLineInterface.so: In function `main':
    /home/daniel/skola/exjobb/miniballscripts/Common/CommandLineInterface.cc:6: multiple definition of `main'

    Los símbolos que se multiplican definidos son estándar en Unix y nunca he necesitan molestarse con ellos yo mismo en Mac, aunque no me programación GUI allí.

    Usted necesita mirar libCommandLineInterface.cc con una actitud prejuiciosa y decidir si proporciona cualquier cosa que usted necesita. Usted puede ser capaz de eliminar por completo. Si contiene algunas cosas que usted necesita, usted necesita para cauterizar el material que define _start, y _end y main y así sucesivamente.

    Usted también va a tener que preocuparse de la falta vtables:

    [...]/libTransfer.so: undefined reference to `vtable for Annular'
    [...]/libTransfer.so: undefined reference to `ROOT::GenerateInitInstance(Barrel const*)'
    [...]/libTransfer.so: undefined reference to `ROOT::GenerateInitInstance(Annular const*)'
    [...]/libTransfer.so: undefined reference to `vtable for Barrel'
    [...]/libTransfer.so: undefined reference to `vtable for Crystal'
    [...]/libTransfer.so: undefined reference to `vtable for Germanium'
    Muchas gracias por tu respuesta. El eh_frame_hdr problema fue solucionado, ahora es a la falta de vtable-mensajes.

    OriginalEl autor Jonathan Leffler

  3. 0

    Es resuelto. El eh_frame_hdr-problema fue resuelto por este hilo. El indefinido referencias fue resuelto mediante la eliminación de libTransfer.so después de la primera make y, a continuación, inmediatamente después de ejecutar make de nuevo. No me pregunten cómo, pero que hizo de compilación.

    «La eh_frame_hdr-problema fue resuelto por este hilo…» – ¿Cómo o dónde? Yo no veo que se declaró en cualquier lugar.
    Esto fue hace algunos años, pero en un comentario a la aceptación de la respuesta escribí que -shared (y al parecer -fPIC) hizo la eh_frame_hdr mensajes desaparecen.

    OriginalEl autor Daniel Andersson

Dejar respuesta

Please enter your comment!
Please enter your name here