Фортран — соединение C ++ с BLAS и LAPACK

Для вызова процедуры на Фортране из c ++ я использовал:
extern «C» void рутинное имя _ (…)
с добавленным подчеркиванием, делающим это совместимым с именем подпрограммы Фортрана «ROUTINENAME».

Когда я связываю c ++ с BLAS или LAPACK, он работает только БЕЗ подчеркивания. В чем разница между связыванием c ++ с этими библиотеками, написанными на фортране, что делает подчеркивание ненужным?

2

Решение

Я могу ошибаться, учитывая, что информации очень мало, но …

От Вот: первые компиляторы F77 добавили _ на имена функций в ABI. Это поведение отличается от C, который просто берет имя функции и использует его в качестве имени в ABI.

Некоторые компиляторы F77 вели себя по-разному, вместо этого в верхнем регистре вводилось имя всей подпрограммы, так что foo() стал FOO() когда их видели компиляторы C. UNIX, Фортран имитировал поведение C и просто копировал-вставлял имя так, чтобы foo() было foo() в ABI тоже.

Если вы посмотрите на привязки BLAS к C для эталонной реализации Вот, тем не менее, вы увидите, что они обрабатывают заключительные подчеркивания при работе с F77. Держу пари, подчеркивания были гораздо более распространенной особенностью ABI F77 в прошлом, чем отсутствие их.

Позднее в Fortran 2003 была введена совместимость с C (см. Вот). Это сделало схему именования функций одинаковой при использовании определенных конструкций Фортрана (см. Вот).

Таким образом, я собираюсь сделать дикое предположение, что это как-то связано с различиями ABI между версиями Fortran. Или даже только между компиляторами, учитывая, что разные компиляторы в Фортране ведут себя по-разному.

Итак, опять же, я не уверен, соответствует ли это вашей ситуации, учитывая, что в вашем вопросе не так много вопросов, но я не мог вписать все это в комментарий, поэтому здесь это как «ответ» ,

И если я ошибаюсь, скажи мне, чтобы я мог исправить почту.

tl; dr: потому что версии компилятора

0

Другие решения

Других решений пока нет …