我正在努力使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);
但这不会改变任何东西。
如何将这些符号修改为大写?
答案 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一起工作不只是链接正确的库和使用正确的符号而已。