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
相关产品推荐
相关产品推荐

