matlab - 如何使 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);
但这并没有改变任何东西。
如何将这些符号修改为大写?
解决方案
我已经解决了我遇到的具体问题,但解决方案并不令人满意(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 一起工作似乎不仅仅是链接正确的库和使用正确的符号。
推荐阅读
- java - jdk版本如何决定——Oracle发布周期更短
- groovy - 在groovy中映射,如何从键中获取值?
- php - 我可以从 mysql 表中获取值并将其设置为变量吗?
- qt - Qt Installer Framework - 防止安装在非空文件夹中
- sql - 在 sybase 中,如何锁定正在执行的存储过程并更改存储过程返回的表?
- java - Spring推送通过WebSocket向未经身份验证的用户发送消息
- drools - 带有 KIE 执行服务器的 Business Central BPMN 图和 Drools 规则流组
- arrays - 为什么 cap 不打印底层数组的长度?
- python - 熊猫通过整数切片与整数列表进行选择
- vue.js - 如何通过将迭代值之一评估为计算值来使用 v-for 有条件地呈现列表?