如何制作ld出口大写符号?

时间:2019-04-04 17:49:21

标签: matlab fortran ld gfortran mex

我正在努力使gfortran能够代替Windows 10上用于MATLAB的Intel Fortran编译器。GCC的名称改写风格(至少对于gfortran而言)是使符号名称全部小写并添加下划线。 “ mxIsNumeric800”变为mxisnumeric800_。为了使MATLAB能够识别符号,它们必须省略附加的下划线(简单,只需在编译器选项中添加-fno-underscoring),并且完全由大写字母数字字符组成(困难,但可能)。

我已经能够使用this answer中描述的方法解决此大小写问题,但是我无法使导出的符号保持大写。这是使用gfortran编译的mex文件(dumpbin /exports timestwo.mexw64输出的一部分)的导出符号:

ordinal hint RVA      name

      1    0 00001510 mexfilerequiredapiversion
      2    1 000013E0 mexfunction
      3    2 000013C0 timestwo

以及使用Intel Fortran编译器编译的相同文件:

ordinal hint RVA      name

      1    0 00001150 MEXFILEREQUIREDAPIVERSION
      2    1 00001000 MEXFUNCTION

英特尔编译器通过链接器选项/EXPORT:FOO处理导出,该选项两次使用,一次用于MEXFUNCTION,一次用于MEXFILEREQUIREDAPIVERSION。我尝试使用的.def文件包括

EXPORTS
MEXFUNCTION
MEXFILEREQUIREDAPIVERSION

但是链接它(与带有小写或驼峰符号的.def文件相反)不会改变任何东西。我也尝试添加到链接脚本中:

EXTERN(MEXFUNCTION,MEXFILEREQUIREDAPIVERSION);
PROVIDE(mexfunction = MEXFUNCTION);
PROVIDE(mexfilerequiredapiversion = MEXFILEREQUIREDAPIVERSION);

但这不会改变任何东西。

如何将这些符号修改为大写?

1 个答案:

答案 0 :(得分:0)

我已经解决了我遇到的特定问题,但是解决方案并不令人满意(gfortran编译的mex文件仍然会导致MATLAB崩溃)。

事实证明,有几种方法可以完成手动符号大写。我以为BIND(C,NAME="")是我认为没有用但后来发现不了的一个。像subroutine mexfunction(nlhs, plhs, nrhs, prhs) bind(C,name="MEXFUNCTION")这样的混合函数将导致可以导出的大写MEXFUNCTION符号。

另一种方法是在导出定义(.def)文件中为符号添加别名。包含

的文件
EXPORTS
MEXFUNCTION = mexfunction
MEXFILEREQUIREDAPIVERSION = mexfilerequiredapiversion
运行链接程序时包含的

也会导致导出所需的符号。这些都不是解决问题的方法,即使它不能解决我要解决的总体问题。

使用这两种方法中的任何一种都会导致mex函数运行时使MATLAB崩溃。当来自VCRUNTIME140.dll的memcpy在mex函数的开头运行时,将导致崩溃,从而导致访问冲突。通过使用调试符号构建mex函数,我能够使MATLAB输出故障转储。

不幸的是,看起来gfortran与MATLAB一起工作不只是链接正确的库和使用正确的符号而已。