Как связать с определенной библиотекой (g ++; libstdc ++. So.5 и libstdc ++. So.6) - PullRequest
4 голосов
/ 31 августа 2010

Простой вопрос - есть ли способ заставить компоновщик g++ связываться с определенной версией библиотеки libstdc++? Я не нашел ничего полезного в справочной странице gcc / g++, как и в других вопросах здесь.

Вот ситуация - мое приложение использует определенную разделяемую библиотеку, которая построена с libstdc++.so.5, и я хочу установить и использовать ее на RHEL5. Итак, когда я пытаюсь собрать приложение на компьютере RHEL5, я получаю предупреждение:

warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with libstdc++.so.6

Установка compat-libstdc++ об / мин не помогла, программа вылетает на деструкторе std::string из-за невозможности . Итак, на этой RHEL5 машине у меня есть это:

[root@xxx]# ll /usr/lib/libstd*  
-rwxr-xr-x 1 root root 259532 Aug 21 2006 /usr/lib/libstdc++-3-libc6.2-2-2.10.0.so  
lrwxrwxrwx 1 root root 31 Jul 28 19:35 /usr/lib/libstdc++-libc6.2-2.so.3 -> libstdc++-3-libc6.2-2-2.10.0.so  
lrwxrwxrwx 1 root root 18 Aug 24 15:08 /usr/lib/libstdc++.so.5 -> libstdc++.so.5.0.7  
-rwxr-xr-x 1 root root 733456 Aug 21 2006 /usr/lib/libstdc++.so.5.0.7  

и когда я делаю

[root@xxxx]# ldd my_exe  
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00333000)  
...  
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00ddf000)

что плохо, так как я знаю, что это неопределенное поведение: /

Итак, есть ли способ собрать мой исполняемый файл, используя только libstdc++.so.5? (удаление libstdc++.so.6 не вариант по многим причинам. Статическое связывание тоже не вариант).

Большое спасибо!

1 Ответ

5 голосов
/ 31 августа 2010

Вот таблица версий ABI ;значение по умолчанию для переключателя -fabi-version изменилось с 1 на 2, в то же время g ++ представила libstdc ++. so.6 с 3.4.Это означает, что для ссылки на более старую библиотеку libstdc ++ вам нужно

  • найти и использовать эквивалентные заголовки C ++ вместо тех, которые включены в ваш компилятор
  • , перекомпилировать весь ваш код (илюбые другие библиотеки C ++, которые вы используете) с -fabi-version=1

, в противном случае вы рискуете получить несовместимость ABI.Я не могу сказать вам точно, какие были изменения, но в целом лучше постараться сохранить весь код C ++, который вы скомпилировали, с той же версией компилятора.

Предполагая, что вы не хотите пытаться взломать вещи вместевот так, я думаю, у вас есть два варианта:

  1. попросить поставщика общей библиотеки перекомпилировать библиотеку с вашей версией GCC для вас.Это может быть не тривиально, так как g ++ 3.4 представил новый более строгий синтаксический анализатор C ++.
  2. спросите вашего поставщика, какую версию g ++ они использовали для компиляции библиотеки, и используйте эту версию для компиляции собственного кода.RH может предоставить компилятор compat-gcc, а также libstdc ++ - я не помню.Однако вам также понадобятся версии всех остальных библиотек и библиотек C ++, предоставляемых ОС, которые вы используете, поэтому вам будет проще скомпилировать на ВМ более старую версию Red Hat с правильным компилятором.
...