Вопрос по gcc, c++, linker – связывание программы завершается неудачно при использовании специально созданного gcc

3

Я использую дистрибутив fedora 21, в котором gcc по умолчанию равен 4.9. У меня есть пользовательский gcc / g ++ 4.8 в / usr / local / gcc48 (например, cuda требует gcc = <4.8, и я использую альтернативы обновления, чтобы выбрать этот). Я собирал несколько небольших программ с этой версией 4.8 пока без проблем.

Теперь мне дали исходный код, который использует библиотеки vtk и другие. Если я использую gcc 4.9 по умолчанию, cmake и заставляет работать нормально. Однако при использовании gcc48 я получаю:

/usr/lib64/vtk/libvtkCommonDataModel.so.1: référence indéfinie vers « std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20 »
/lib64/libicuuc.so.52: référence indéfinie vers « [email protected]_1.3.8 »
collect2: erreur: ld a retourné 1 code d'état d'exécution
CMakeFiles/main.dir/build.make:365: recipe for target '../bin/main'   failed
make[2]: *** [../bin/main] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2

Я понимаю, что это ошибка компоновщика, я пытался указать LD_LIBRARY_PATH = / usr / local / gcc48 / lib или LD_LIBRARY_PATH = / usr / local / gcc48 / lib64, но я застрял.

В чем здесь проблема?

Спасибо

Ваш Ответ

2   ответа
4

если вы разместите сообщение об ошибке на английском языке.

Похоже, что неопределенный символ__cxa_throw_bad_array_new_length, Функции__cxa... приходят из библиотеки времени выполнения C ++. G ++ обычно поставляется с собственной версией этой библиотеки, называемойlibsupc++, Я полагаю, что пользовательский G ++ не может найти эту библиотеку или выдает ссылку на символ, которого нет в более новой версии (4.9)libsupc++, Попробуйте скомпилироватьlibsupc++ исходный код, который поставляется с вашей пользовательской версией G ++ и направляет компоновщик к нему. Вам также может понадобиться сделать это дляlibstdc++.

6

__cxa_throw_bad_array_new_length был добавлен вGCC 4.9, Вот что@ CXXABI_1.3.8 суффикс версии означает. Вы можете посмотреть эти коды версий здесь:https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

Эта ошибка означает, что вы пытаетесь связать объектный файл/usr/lib64/vtk/libvtkCommonDataModel.so.1 составлено GCC 4.9 или новее сlibstdc++.so или жеlibsupc++.so от GCC 4.8 или ранее. Либо восстановитьlibvtkCommonDataModel.so с GCC 4.8, или ссылка на правильный libstdc ++. так.

Редактировать: На самом деле, если вы хотите скомпилировать с более новой версией GCC, но запустить с более старой версией libstdc ++., Это можно сделать.

Компилировать с-D_GLIBCXX_USE_CXX11_ABI=0 если вы хотите скомпилировать с GCC 5+ и запустить с libstdc ++. так из старого GCC. Увидетьhttps://bugzilla.mozilla.org/show_bug.cgi?id=1153109 а такжеИспользуя двойной ABI в руководстве по libstdc ++.

Ссылка противcompat.cpp STDC ++ содержит взломы для бэк-компатов из Mozilla. Вы также можете взглянуть на моймодифицированная версия который не зависит ни от каких заголовков Mozilla, но он немного устарел. В частности, это определяет заглушку__cxa_throw_bad_array_new_length.

Похожие вопросы