在 Fortran 程序中,检查是否使用“-g”编译

From within Fortran program, check if compiled with "-g"

我希望在程序编译调试标志时添加一些额外的信息日志记录,-g。我正在使用 gfortran(尽管我认为 -g 无处不在)。在这种情况下,单步执行程序在 gdb 中会特别乏味。特别是,我希望是这样的:

if (compiledwithg()) then
    print *, extraNiceInfo
endif

我知道在 C 程序中人们通常会使用 #ifdef DEBUG 之类的东西,然后打印一些附加信息。据我所知,Fortran 中没有类似的功能。有人知道这样的事情吗?

回答您的问题:是的,在现代版本的 Fortran 中现在可以知道哪些选项用于编译。正如 francescalus 所链接的那样,COMPILER_OPTIONS() 子例程是要走的路。

  use iso_fortran_env

  logical :: compiled_with_g
  character(:), allocatable :: options

  options = compiler_options()

  compiled_with_g =  index(options, "-g") > 0

  print *, compiled_with_g
end

> gfortran-7 compiled_with_g.f90
> ./a.out 
 F
> gfortran-7 -g compiled_with_g.f90
> ./a.out 
 T

注意,它会在任何以 -g 开头或仅包含子字符串 -g 的编译器选项上触发 true。我尝试使用 " -g ",但当字符串以此选项开始或结束时会出现问题。您也可以将这两个特殊情况添加到 if 条件中。


您可以在任何地方使用 #ifdef DEBUG 并使用 -cpp-fpp 编译所有源代码(取决于编译器)。


或者你可以在模块中定义一个全局常量

#ifdef DEBUG
  logical, parameter :: compiled_with_g  = .true.
#else
  logical, parameter :: compiled_with_g  = .false.
#endif

并使用 -cpp-fpp.

编译这个模块

您可以对函数执行相同的操作 compiledwithg() 并且只在函数中使用宏。


或者您可以拥有这个非常小的模块的两个版本:

module debug_mod
  logical, parameter :: debug = .true.
end module

module debug_mod
  logical, parameter :: debug = .false.
end module

并设置您的构建系统(如 Makefile)以使用正确的系统。如果参数为假,编译器将删除死代码,因此它与宏一样高效。