【发布时间】:2018-10-10 13:34:18
【问题描述】:
有没有办法控制共享库中符号的命名?具体来说,我一直在将 GCC 用于我们通过 Python 中的 C-Types 访问共享库的项目。这很好用,但是最近我一直在使用建议使用英特尔编译器的系统。我可以很好地构建共享对象,但我发现这些符号的命名约定与英特尔相比略有不同。特别是当我使用 gcc 编译时,符号名称如下所示:
__test_function_MOD_read_a_file
英特尔编译的共享对象的符号名称如下:
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
【问题讨论】:
-
您的问题确实与共享库无关,而与Fortran 无关。 “我怎样才能使
gfortran和英特尔ifort具有一致的外部函数名称?”这就是我的措辞。 -
mod 文件及其符号修饰在不同编译器之间完全不兼容,即使在同一编译器的主要版本之间也是如此。
-
当然,如果您声明 real(C_FLOAT) bind(C,name=....) x 之类的变量,您可以精确控制兼容 C 编译器所看到的符号名称。
-
需要模块的子程序和函数的代码很容易在编译器之间完全不兼容。例如,GCC 和 Intel 的数组描述符是不同的。这样的代码在这两者之间使用时会崩溃。
-
如果您希望在此上下文中使用数组描述符,只要您的编译器实现了 F2008 新功能,只要 Fortran 编译器与相同的 C 编译器兼容,就应该可以使用它。跨度>
标签: fortran shared-libraries gfortran