You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为CMake配置未知编译器并自定义Fortran预处理源文件后缀

如何为CMake配置未知编译器并自定义Fortran预处理源文件后缀

看起来你已经在为这个小众编译器折腾CMake配置了,前面搞定C/C++的编译链接规则已经很不容易,卡在Fortran预处理的后缀上确实有点头疼😅

核心问题是CMake默认给Fortran预处理后的源文件加了-pp.for后缀,而你的编译器不接受带-的后缀。解决这个问题其实很直接——CMake提供了专门的变量来控制这个后缀:CMAKE_Fortran_PREPROCESS_SOURCE_SUFFIX

具体操作步骤

  1. 设置预处理后缀:在指定Fortran编译器之后(或者project命令之前),直接设置这个变量为你的编译器能接受的后缀,比如改成.ppfor或者.pre.for

    # 先指定你的自定义Fortran编译器路径
    set(CMAKE_Fortran_COMPILER /path/to/your/fortran/compiler)
    # 设置预处理后的源文件后缀,替换掉默认的-pp.for
    set(CMAKE_Fortran_PREPROCESS_SOURCE_SUFFIX ".ppfor")
    
  2. 配合自定义预处理规则:如果你已经自定义了CMAKE_Fortran_PREPROCESS_SOURCE规则,只要规则里保留了<PREPROCESSED_SOURCE>这个占位符,CMake就会自动用你设置的新后缀生成预处理文件。比如你的自定义规则可能是这样的:

    set(CMAKE_Fortran_PREPROCESS_SOURCE
      "<CMAKE_Fortran_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> -o <PREPROCESSED_SOURCE>"
    )
    

    现在<PREPROCESSED_SOURCE>就会以.ppfor为后缀生成,编译器就能正常识别了。

额外的自定义编译器小贴士

既然你在配置完全陌生的编译器,再分享几个实用的CMake变量,帮你覆盖更多特殊场景:

  • CMAKE_<LANG>_OUTPUT_EXTENSION:控制目标文件(比如.o/.obj)的后缀,如果你的编译器用特殊后缀可以调整
  • CMAKE_EXECUTABLE_SUFFIX:控制最终生成的可执行文件后缀(比如Windows下的.exe,或者你的编译器要求的特殊后缀)
  • 自定义编译/链接规则时,尽量保留CMake自带的占位符(比如<DEFINES><INCLUDES><FLAGS>),这样你用target_compile_definitionstarget_include_directories这些现代CMake语法时,设置的参数还能正常传递给编译器,不用全手动硬编码

你前面已经搞定了C/C++的部分,现在加上这个后缀设置,应该就能顺利解决Fortran预处理的问题了。如果还有其他编译器的特殊要求,继续找对应的CMAKE_*变量调整就行,CMake的灵活性足够应对大部分小众编译器的需求。

备注:内容来源于stack exchange,提问作者通配符

火山引擎 最新活动