Могу ли я изменить манипулирование для g++, чтобы оно соответствовало xlC?

Я пытаюсь скомпилировать код на aix, используя g++, так как поддержка xlC С++ 11 очень ограничена.

У меня возникли проблемы с связыванием моего кода с общими библиотеками aix из-за различного искажения имен.

xlC поддерживает замену искажения имени (-qnamemangling=v13), но IBM не предоставила исходники, поэтому мне нужно перекомпилировать с использованием g++ (или xlclang++) с изменением имени xlC.

xlC версия V16.1.

Можно ли заменить искажение имени g++ (или xlclang++) на xlC?

Есть ли другая альтернатива?


person SHR    schedule 12.06.2019    source источник
comment
Что ж, C++ не стандартизирует форматы двоичных файлов; объектные модули и библиотеки разных компиляторов вряд ли будут совместимы.   -  person Lorinczy Zsigmond    schedule 12.06.2019


Ответы (1)


xlC и g++ несовместимы с AIX. Они используют разные объектные модели и стандартные библиотеки.

В XLC++ 16.1 есть компилятор xlclang++ с полной поддержкой C++11, однако он также несовместим с xlC, поскольку совместимость с C++11 нарушена. xlclang++ использует стандартную библиотеку, основанную на libc++ (LLVM), а xlC использует собственную унаследованную библиотеку libC.a. Совместимость через C сохраняется, поэтому вы можете перекомпилировать или переработать свои интерфейсы в неперекомпилированные интерфейсы C++ для прохождения через C-уровень.

person Chris Bowler    schedule 12.06.2019
comment
Я могу связать с функцией extern "C", поэтому я думаю, что это не так уж и отличается. Я думал о замене методов искажения g++ или что-то в этом роде. - person SHR; 16.06.2019
comment
Вы можете использовать extern C, однако будьте осторожны, потому что после перехода от xlC к скомпилированному коду xlclang++ вы должны предположить, что типы C++ будут расположены по-другому. Рассмотрим: extern C void foo(std::vector‹int› &v); Если вектор создается на стороне xlC и используется на стороне xlclang++, нет никаких ожиданий, что это сработает (даже для определяемых пользователем типов C++). Компиляторы изменили искажение, чтобы избавить вас. Использование extern C означает, что вы знаете, что делаете. - person Chris Bowler; 17.06.2019