Имя искажения и свалка - PullRequest
       39

Имя искажения и свалка

1 голос
/ 02 декабря 2011

Вчера я помогал другу скомпилировать примеры Intel MKL Java. У нас были проблемы с «неразрешенными внешними объектами», хотя все выглядело нормально (в соответствии с файлами примеров / makefile).

Затем я использовал dumpbin Visual Studio, чтобы проверить, присутствуют ли в библиотеке неразрешенные функции. Одним из примеров неразрешенного внешнего объекта была функция с именем _cblas_sgemm. При выводе символов из библиотеки (dumpbin /symbols mkl_core.lib) мне удалось найти только функцию cblas_sgemm в библиотеке, которая пропустила префикс _. Затем я обнаружил, что функция на самом деле называлась только cblas_sgemm, и что компилятор добавил префикс _, как часть правила искажения имени.

TL; DR

Итак, мои вопросы:

  1. Отображает ли dumpbin полное имя точки входа в библиотеке? Или по какой-то причине оно на самом деле «деформирует» имя?
  2. Библиотека поставлялась с установочным пакетом, поэтому я не знаю, какой компилятор использовался для его компиляции. Разные компиляторы выдают разные имена?

Я не думаю, что понял это правильно; Возможно, я делаю что-то не так в другом месте, но я хочу быть уверенным в этих двух вопросах.

Подобный вопрос без ответов: здесь .

1 Ответ

2 голосов
/ 02 декабря 2011
  1. dumpbin покажет полное имя символа в библиотеке (не в источнике), без чередования. Для MS, искаженной из имен C ++, в скобках будет показан исходный символ (если он может определить исходный символ). (проверено на мусорной корзине 9.00.21022.08)

  2. Различные компиляторы генерируют разные символы, особенно для символов C ++. Что касается символов, компиляторы, как правило, имеют соглашение об искажении имен, поэтому символы extern "C" могут быть связаны между различными компиляторами.

Вот статья из Википедии о искалечении имени .

...