在 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)以使用正确的系统。如果参数为假,编译器将删除死代码,因此它与宏一样高效。
我希望在程序编译调试标志时添加一些额外的信息日志记录,-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)以使用正确的系统。如果参数为假,编译器将删除死代码,因此它与宏一样高效。