Можно ли разобрать символы С++ вручную?

Я получаю некоторые ошибки, как это:

dyld: lazy symbol binding failed: Symbol not found: __ZN2nm8RationalIxEC1ERKNS_10RubyObjectE
  Referenced from: /Users/jwoods/Projects/nmatrix/lib/nmatrix.bundle
  Expected in: flat namespace

dyld: Symbol not found: __ZN2nm8RationalIxEC1ERKNS_10RubyObjectE
  Referenced from: /Users/jwoods/Projects/nmatrix/lib/nmatrix.bundle
  Expected in: flat namespace

а затем то же самое для __ZN2nm7ComplexIfEC1ERKNS_10RubyObjectE.

К сожалению, c++filt, похоже, не хочет их разбирать. Когда я пытаюсь ввести их в онлайн-интерфейс c++filtjs, я получаю сообщение "Не искаженный символ C++».

Я немного озадачен сообщением об ошибке, так как пример c++filtjs дает _ZN9wikipedia7article8wikilinkC1ERKSs, который представляет wikipedia::article::wikilink::wikilink(std::string const&). Я вижу несколько шаблонов, среди них ZN#, 7 и 8 для :: и C1ERK для того, что, как я предполагаю, является своего рода передачей по ссылке конструктору.

Я предполагаю, что он жалуется на отсутствие одного из моих конструкторов для class Rational, например Rational::Rational(RubyObject const&). Однако Rational — это шаблон, поэтому мне было бы полезно понять, какая версия отсутствует.

Но вопрос здесь действительно в том, как я могу разобрать вручную. =)


person Juno Woods    schedule 13.08.2013    source источник
comment
Вероятно, вам придется удалить один из _ в начале искаженного имени.   -  person Shafik Yaghmour    schedule 14.08.2013
comment
nm::Complex::Complex(nm::RubyObject const&) — первый, nm::Rational::Rational(nm::RubyObject const&) — второй. Вы должны удалить первые _ из искаженного имени.   -  person Rapptz    schedule 14.08.2013
comment
Это вполне возможно сделать своими руками. Однако вам нужно знать правила искажения, которые различаются от компилятора к компилятору... Уберите первое подчеркивание (их два), и это, скорее всего, сработает.   -  person Mats Petersson    schedule 14.08.2013
comment
Ах! Спасибо, парни. Это полезно. Не имеет прямого отношения к этому вопросу: я знаю, как явно скомпилировать определенный класс шаблона, например, Rational<int>, но как мне явно скомпилировать конкретный конструктор класса шаблона?   -  person Juno Woods    schedule 14.08.2013
comment
@mohawkjohn: Самый простой способ — создать экземпляр класса, используя нужный конструктор. Большинство компиляторов не будут генерировать код, который никогда не использовался, особенно из шаблона. Однако, как только компилятор увидит, что вы на самом деле используете конструктор, он включит его в генерируемый им код (хотя он может сделать это встроенным).   -  person cHao    schedule 14.08.2013
comment
Вы пытались поиграть с переключателями C++filt? Иногда передача c++filt -t -n, чтобы не игнорировать _, может привести к путанице в именах.   -  person greatwolf    schedule 14.08.2013


Ответы (1)


Символ выглядит как созданный clang или gcc. Оба этих компилятора используют ABI на основе Itanium ABI. . Этот документ включает разборку, описывающую, как внешние символы построены. Если вы усвоите соответствующие правила, вы сможете распутать имена.

Я не смог найти документ на исходном сайте и не знаю, где находится официальный документ.

person Dietmar Kühl    schedule 13.08.2013