Можно ли использовать разные библиотеки libstdc++ в одной программе?

У меня есть старая платформа приложений, которую нужно скомпилировать с помощью gcc 4.4.4 и старой libstdc++.so, которые не поддерживают C++14.

Я хочу использовать gcc 6.2 для написания новых функций на C++14 и компилировать их в статическую библиотеку myslib.a.

myslib.a экспортирует свои функции только в чистые интерфейсы C для совместимости с ABI.

Моя проблема: фреймворк использует старый libstdc++.so, который несовместим с C++14.

Можно ли заставить myslib.a статически связывать последнюю версию libstdc++.a и игнорировать более раннюю версию libstdc++.so?


person xmllmx    schedule 29.08.2016    source источник
comment
Я не думаю, что это можно сделать для статической библиотеки. Почему бы вам не сделать это так?   -  person Leon    schedule 29.08.2016
comment
должен быть скомпилирован с gcc 4.4.4: почему? Более того, libstdc++.so.6 обратно совместим, поэтому вы можете просто использовать более новую версию.   -  person Marc Glisse    schedule 29.08.2016
comment
Вы пытались скомпилировать его с помощью gcc-6? Вы пытались скомпилировать его с помощью gcc-4.4, но связать с gcc-6? Какие ошибки были в этих случаях?   -  person Jan Hudec    schedule 29.08.2016
comment
@ Леон, так можно использовать   -  person xmllmx    schedule 29.08.2016
comment
@Leon, ELF делает все возможное, чтобы статические и динамические библиотеки вели себя одинаково. Чтобы заставить .so использовать каждую свою собственную среду выполнения, требуется много черной магии в системах ELF (в отличие от систем DLL, где они просто делают это, и нужно соблюдать осторожность, если вы хотите, чтобы они использовали одну и ту же).   -  person Jan Hudec    schedule 29.08.2016
comment
@MarcGlisse, в фреймворке уже есть много общих библиотек, скомпилированных с помощью более старой версии libstdc++.so.   -  person xmllmx    schedule 29.08.2016
comment
Отвечая на вопрос в заголовке, нет. Вы должны быть в состоянии скомпилировать и/или связать старый фреймворк с новым libstd++.so.   -  person n. 1.8e9-where's-my-share m.    schedule 29.08.2016
comment
Почему бы просто не скомпилировать весь материал с новым gcc и использовать разные -std=c++VERSION для разных файлов, например -std=c++03 для старых файлов и -std=c++14 для новых.   -  person fghj    schedule 29.08.2016
comment
@ user1034749, фреймворк должен использовать некоторые скомпилированные библиотеки, поэтому я не могу пересобрать все с помощью gcc 6.2.   -  person xmllmx    schedule 29.08.2016
comment
Опять же: libstdc++.so.6 обратно совместим. Вы можете скомпилировать с помощью gcc 4.4.4, затем заменить libstdc++.so.6 новой версией, и программа по-прежнему будет работать нормально.   -  person Marc Glisse    schedule 29.08.2016
comment
@MarcGlisse Наверное, ты прав. Я читал, что ABI изменился с GCC 5.1, но теперь у них есть как новая, так и старая реализации в разных пространствах имен в одной и той же библиотеке, так что это должно работать. Если у вас все еще есть проблемы, вы можете использовать библиотеку C-wrapper, которая статически связывает вашу другую версию libstdc++.a, как в этот пост   -  person karsten    schedule 01.06.2018