Наименование символов в общей библиотеке Fortran, intel против gcc? - PullRequest
0 голосов
/ 10 октября 2018

Есть ли способ управления именованием символов в общих библиотеках?В частности, я использовал GCC для проекта, где мы получаем доступ к разделяемой библиотеке через C-Types в Python.Это прекрасно работает, однако недавно я работал с системой, в которой предлагается компилятор Intel.Я могу создать общий объект просто отлично, но я считаю, что символы имеют немного другое соглашение об именах по сравнению с Intel.В частности, когда я компилирую с помощью gcc, имена символов выглядят следующим образом:

__test_function_MOD_read_a_file

скомпилированный совместно используемый объект Intel имеет имена символов, такие как:

test_function_mp_read_a_file__

Существует ли способ принудительного согласованияназывать или хотя бы менять имя символов после факта?

Например, рассмотрим следующий бит кода test_function.f90

MODULE test_function
   CONTAINS
   SUBROUTINE read_a_file
      PRINT *,'I did a thing!'
   END SUBROUTINE
END

Строка компиляции должна выглядеть примерно так:

gfortran -fPIC -c test_function.f90
gfortran -shared -o libtest_function.so test_function.o

1 Ответ

0 голосов
/ 11 октября 2018

Оба компилятора искажают имена подпрограмм, содержащихся в модуле.Стандарт Fortran не предписывает никаких соглашений об именах.Вы можете предотвратить искажение имени, используя функцию привязки ISO C в Fortran, чтобы дать подпрограмме конкретное имя.Например,

module bar
   contains
   function fun(x) bind(c, name='foo')
       real fun, x
       fun = x
   end function fun
   function goo(x)
       real goo, x
       goo = x
   end function goo
end module bar

При компиляции с gfortran результирующий объектный файл содержит

gfortran -c a.f90
nm a.o
00000000 T __bar_MOD_goo
00000013 T foo

Таким образом, вы можете ссылаться на функцию fun как foo в библиотеке.Возможно, вы также захотите использовать типы, определенные модулем iso_c_binding.

...