代码之家  ›  专栏  ›  技术社区  ›  Caterina

如何根据Makefile的配置在Fortran程序中使用静态库的模块[duplicate]

  •  0
  • Caterina  · 技术社区  · 6 年前

    use device_info
    

    但是,我只想在Makefile中选择此选项时包含此库:

    ifeq ($(strip $(WITH_GPU)),1) 
    

    (当GPU等于1时)。如果我没有使用GPU,device\u info.mod应该不可用,因为我不需要它。我该怎么做?

    基本上我想消除这个错误:

    Fatal Error: Can't open module file 'device_info.mod' for reading at (1): No such file or directory
    

    在没有定义device\u info.mod的库的情况下编译时。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Renaud Pacalet    6 年前

    您可能需要:

    1. 隐藏或不隐藏 use device_info Fortran源文件中的声明,具体取决于传递给它的选项。Fortran编译链中有预处理器吗?如果是,您知道如何从命令行传递选项,以及如何在源文件中使用它们来隐藏或不隐藏部分代码吗?

    假设你有一个预处理器,它有一个 #ifdef - #endif -D MACRO=VALUE

    <compiler-name> <options> <source-file> -o <binary-output-file>
    

    只需编辑源文件并添加:

    #ifdef WITH_GPU
    use device_info
    #endif
    

    COMPILER           := <whatever-compiler-you-use>
    COMPILER_FLAGS     := <whatever-compiler-options-you-need-by-default>
    OTHER_DEPENDENCIES := <whatever-default-dependencies>
    
    ifeq ($(strip $(WITH_GPU)),1) 
    COMPILER_FLAGS     += -D WITH_GPU=1
    OTHER_DEPENDENCIES += device_info.mod
    endif
    
    initprogram.exe: initprogram.f90 $(OTHER_DEPENDENCIES)
        $(COMPILER) $(COMPILER_FLAGS) $< -o $@
    

    (the) $< $@ 使自动变量分别展开到第一个先决条件( initprogram.f90 initprogram.exe )规则的一部分)。