Windows10下适配多Fortran编译器的预处理指令问题
解决多Fortran编译器适配的预处理指令问题
看起来你已经找对了方向——用预处理指令来适配不同编译器,但几个细节没处理好导致报错,我来帮你一步步解决:
核心问题分析
你的报错主要来自两个点:
- gfortran默认未启用C预处理器:
#ifdef这类指令是C预处理器的语法,gfortran默认不会解析它们,所以会被当成非法语句。 - 部分编译器的语法格式错误:比如Lahay Fortran的
dll_export写法不对,还有预处理指令的位置/格式不符合编译器要求。
修正后的代码
下面是适配gfortran、Intel Fortran(iFORT)和Lahay Fortran的完整代码,我调整了预处理指令格式和各编译器的导出语法:
! Computes the square of a number Subroutine sr1(a,b) ! 注意:C风格预处理指令要顶格写,避免被当成注释 #ifdef COMPILER_GF !GCC$ ATTRIBUTES DLLEXPORT :: sr1 !GCC$ ATTRIBUTES C, REFERENCE, ALIAS:'sr1' :: sr1 #endif #ifdef COMPILER_IF !DEC$ ATTRIBUTES DLLEXPORT, STDCALL :: sr1 !DEC$ ATTRIBUTES DECORATE, ALIAS : 'sr1' :: sr1 !DEC$ ATTRIBUTES REFERENCE :: a,b #endif #ifdef COMPILER_LF !LF$ DLL_EXPORT :: sr1 !LF$ ATTRIBUTES C, REFERENCE :: a,b #endif implicit none integer a,b b = a*a End Subroutine sr1
正确的编译命令
1. gfortran编译
必须加上-cpp选项启用预处理器,否则#ifdef会被忽略或报错:
gfortran -cpp -shared -o test_mod.dll test_mod.f90 -DCOMPILER_GF
补充:
-cpp等价于-fpreprocessor,都是告诉gfortran启用C预处理器解析#ifdef这类指令。
2. Intel Fortran(iFORT)编译
Intel Fortran默认支持预处理指令,直接定义宏即可:
ifort -shared -o test_mod.dll test_mod.f90 /DCOMPILER_IF
Windows下用
/D,Linux下用-D,和gfortran一致。
3. Lahay Fortran编译
Lahay Fortran的预处理和导出语法需要用!LF$前缀,编译命令:
lf95 -shared -o test_mod.dll test_mod.f90 -DCOMPILER_LF
关键细节说明
- 预处理指令顶格写:C风格的
#ifdef、#endif必须顶格,不能有缩进,否则部分编译器会把它们当成普通注释,无法正确解析。 - 编译器专属属性前缀:
- gfortran用
!GCC$前缀,而不是Intel的!DEC$,否则gfortran会忽略这些属性。 - Lahay Fortran用
!LF$前缀来标记编译器专属指令,直接写dll_export sr1不是合法的Fortran语句,所以会报"Unclassifiable statement"错误。
- gfortran用
- R的.Fortran()兼容性:确保所有编译器都导出
C风格的接口(REFERENCE属性传递参数,ALIAS指定子程序名),这样R的.Fortran()才能正确调用。
内容的提问来源于stack exchange,提问作者khajlk
相关产品推荐
相关产品推荐

