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

Gav*_*ley 2 debugging fortran gfortran

我希望在程序编译调试标志时添加一些额外的信息记录-g.我正在使用gfortran(虽然我认为-g无处不在).在这种情况下,单步执行程序在gdb中尤其繁琐.特别是,我希望有类似的东西:

if (compiledwithg()) then
    print *, extraNiceInfo
endif
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*r F 5

要回答你提出的问题:是的,现在可以在现代版本的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
Run Code Online (Sandbox Code Playgroud)

> gfortran-7 compiled_with_g.f90
> ./a.out 
 F
> gfortran-7 -g compiled_with_g.f90
> ./a.out 
 T
Run Code Online (Sandbox Code Playgroud)

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


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


或者,您可以在模块中定义全局常量

#ifdef DEBUG
  logical, parameter :: compiled_with_g  = .true.
#else
  logical, parameter :: compiled_with_g  = .false.
#endif
Run Code Online (Sandbox Code Playgroud)

-cpp或编译这个模块-fpp.

您可以对函数执行相同操作,compiledwithg()并仅在函数中使用宏.


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

module debug_mod
  logical, parameter :: debug = .true.
end module
Run Code Online (Sandbox Code Playgroud)

module debug_mod
  logical, parameter :: debug = .false.
end module
Run Code Online (Sandbox Code Playgroud)

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