Для вызова процедуры на Фортране из c ++ я использовал:
extern «C» void рутинное имя _ (…)
с добавленным подчеркиванием, делающим это совместимым с именем подпрограммы Фортрана «ROUTINENAME».
Когда я связываю c ++ с BLAS или LAPACK, он работает только БЕЗ подчеркивания. В чем разница между связыванием c ++ с этими библиотеками, написанными на фортране, что делает подчеркивание ненужным?
Я могу ошибаться, учитывая, что информации очень мало, но …
От Вот: первые компиляторы 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: потому что версии компилятора
Других решений пока нет …