C ++: ошибка компиляции - «таблица .eh_frame_hdr не будет создана» - PullRequest
6 голосов
/ 12 сентября 2010

Я должен использовать программу анализа данных для физического эксперимента. Я не могу заставить его скомпилировать.

Код старый, не очень совместимый с текущими GCC-версиями из того, что я могу найти. Чтобы сделать это более трудоемким, я получил код от парня, который изменил все make-файлы, чтобы он компилировался на Mac. У меня нет C ++ - опыта, но с man-страницами, Google и терпением я исправил много ошибок, но я застрял на этом, даже после недели попыток и поиска в Google.

Я считаю, что соответствующее сообщение об ошибке следующее:

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

В чем может быть причина, и в чем может быть лекарство?

libCommandLineInterface.so был скомпилирован мной ранее, без каких-либо явных сообщений об ошибках:

$ 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

Мой g ++ - версия g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3, amd64.

Как я уже сказал, у меня нет опыта работы с C ++, поэтому, возможно, мои наивные модификации Makefile что-то разрушили. Отсутствие у меня опыта также заставляет меня не знать, какая еще информация необходима для меня, но я буду рад ответить.

Ответы [ 3 ]

3 голосов
/ 12 сентября 2010

Похоже, вы забыли параметр командной строки -shared при создании файла libCommandLineInterface.so.Это объяснило бы эти множественные ошибки определения.Если компоновщик считает, что файл, который он генерирует, является исполняемым файлом (а не динамической библиотекой), он будет ссылаться на код запуска и т. Д. При попытке использовать этот файл .so эти символы поступают из кода запуска.будет конфликтовать с теми, которые добавляются в исполняемый файл, который использует динамическую библиотеку.

Возможно, что ошибки libTransfer.so связаны с тем же опущенным флагом.Разрешается, чтобы разделяемая библиотека имела висячие ссылки (которые разрешаются при использовании библиотеки), но исполняемый файл должен иметь все символы, разрешенные во время ссылки.Это, вероятно, упрощенное представление о том, как обстоят дела, но мне никогда не нужно было вдаваться в подробности о динамическом линковании в linux.:) В любом случае, добавление опции -shared может также решить неопределенные ошибки ссылок.

1 голос
/ 12 сентября 2010

Ошибки связывания беспокойства начинаются с:

[...]/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'

Символы, которые многократно определены, являются «стандартными» в Unix - и мне никогда не нужно было беспокоиться о них самих на Mac, хотя я не занимаюсь программированием GUI там.

Вам нужно взглянуть на libCommandLineInterface.cc с предвзятым отношением и решить, предоставляет ли он что-нибудь, что вам нужно. Вы могли бы быть в состоянии удалить это вообще. Если в нем есть что-то, что вам нужно, вам нужно будет прижать материал, который определяет _start, _end и main и т. Д.

Вам также придется беспокоиться о пропавших 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'
0 голосов
/ 26 сентября 2010

Это решено. Задача eh_frame_hdr была решена этим потоком. Неопределенные ссылки были решены путем удаления libTransfer.so после первого make, а затем сразу же после запуска make. Не спрашивайте меня как, но это заставило его скомпилироваться.

...