首页 > 解决方案 > 如何使 ld 导出大写符号?

问题描述

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

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

ordinal hint RVA      name

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

以及使用英特尔 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);

但这并没有改变任何东西。

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

标签: matlabfortranldgfortranmex

解决方案


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

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

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

EXPORTS
MEXFUNCTION = mexfunction
MEXFILEREQUIREDAPIVERSION = mexfilerequiredapiversion

运行链接器时包含也将导致导出所需的符号。这些中的任何一个都是问题的解决方案,即使它不是我试图解决的整体问题的解决方案。

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

不幸的是,让 gfortran 与 MATLAB 一起工作似乎不仅仅是链接正确的库和使用正确的符号。


推荐阅读