You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU Fortran编译DLL时所有子程序导出且大小写不匹配问题

解决GNU Fortran编译DLL时的符号导出问题

1. 仅导出指定子程序

GNU Fortran编译共享库(DLL)时,默认会导出所有全局可见的符号,Intel风格的!DEC$ ATTRIBUTES DLLEXPORT在GCC中无法直接限制仅导出目标符号,可通过以下两种方式解决:

方法一:用GCC原生属性控制

将需要导出的子程序改为GCC兼容的写法,明确绑定C风格名称并标记导出,同时默认隐藏其他符号:

subroutine CXXXXXX() bind(C, name='CXXXXXX')
    !GCC$ ATTRIBUTES DLLEXPORT :: CXXXXXX
    ! 子程序代码逻辑
end subroutine CXXXXXX

编译时添加-fvisibility=hidden选项,让所有未显式标记导出的符号默认隐藏;若个别子程序需单独隐藏,直接添加!GCC$ ATTRIBUTES HIDDEN :: 子程序名即可。

方法二:用链接器脚本精准控制

创建一个导出脚本(例如命名为export_symbols.list),内容仅保留需要导出的符号:

{
    global: CXXXXXX;
    local: *;
};

然后在链接器选项中添加-Wl,--version-script=export_symbols.list,链接器将只导出脚本中指定的符号。

2. 保留导出符号的大写格式

GNU Fortran默认会将Fortran符号转换为小写,要保留大写的CXXXXXX,需做到两点:

  • 在子程序声明中使用bind(C, name='CXXXXXX'),强制指定导出的符号名称为大写,直接覆盖GCC的默认转换规则。
  • 确保已启用-fno-underscoring编译选项,该选项会避免在符号后添加后缀下划线,配合bind(C)的name参数即可精准导出目标大写名称。

调整后的编译/链接选项参考

编译选项:

-fPIC -DBUILD_DLL -Wtabs -fno-automatic -fdollar-ok -fno-underscoring -fno-second-underscore -fvisibility=hidden

链接器选项(使用链接器脚本时需添加最后一项):

-static -mrtd -shared -Wl,--kill-at -Wl,--version-script=export_symbols.list

内容的提问来源于stack exchange,提问作者IAyestaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:55:18