标签: gfortran

gfortran、DLL、下划线

我想从第三方 DLL 访问一些子例程。这些函数使用 STDCALL 作为调用约定。

跑步dumpbin /export foo.dll给了我类似的东西:

      ...
      7    6 00004B40 Foo@16
      ...
Run Code Online (Sandbox Code Playgroud)

我使用以下方法编译我的代码:

      gfortran test.f90 -o test.exe -Wl,foo.dll
Run Code Online (Sandbox Code Playgroud)

我收到错误:(undefined reference to '_foo_'注意下划线)。

我尝试添加-mrtd编译标志以及我在谷歌上搜索的其他标志,但都无济于事。

我怎样才能告诉 fortran 不要添加下划线?


编辑:需要进行一些澄清。

  1. 我有一个现有的 DLL,但没有源代码。
  2. 如果有帮助的话,此 DLL 是用 Visual Basic 编写的。
  3. 我想从fortran调用这个 DLL 。
  4. 当我在 test.f90 中写入时:Foo(1.0d0)出现undefined reference to '_foo_'链接错误

dll fortran gfortran

1
推荐指数
1
解决办法
8153
查看次数

为什么 fortran 不迭代字符串

当我声明一个字符串时:

character(19) :: line 
do I = 1, 19, 1 
if (line(I) == 'n')
Run Code Online (Sandbox Code Playgroud)

编译器告诉我一个错误。如何解决这个问题?当我这样声明时:

character line(19)
Run Code Online (Sandbox Code Playgroud)

我对 -if 没有任何问题,但是我必须在要放入字符串中的每个字符后按 Enter 键。

arrays string fortran gfortran

1
推荐指数
1
解决办法
716
查看次数

为什么在 fortran 程序中使用 shape(2) 不打印任何内容?

考虑以下短程序(Fortran95):

   write(*,*) shape(2)
   end
Run Code Online (Sandbox Code Playgroud)

我尝试使用 Fortran 编译器 (gfortran 4.8.2) 和 Absoft Pro Fortran 13.0.0 (mac) 运行它,我得到以下结果:

local $./a.out 

local $
Run Code Online (Sandbox Code Playgroud)

更新:还尝试了 gfortran 4.4.7(具有相同结果的 linux。

以下是gfortran 中形状的文档说

RESULT = SHAPE(SOURCE [, KIND]) 
Run Code Online (Sandbox Code Playgroud)

参数:
SOURCE 应为任何类型的数组或标量。如果 SOURCE 是一个指针,它必须被关联并且必须分配可分配的数组。

返回值:
秩为 1 的 INTEGER 数组,其元素数与 SOURCE 的维数相同。结果数组的元素对应于 SOURCE 沿各自维度的扩展。如果 SOURCE 是标量,则结果是大小为零的排名一的数组。如果 KIND 不存在,则返回值具有默认整数种类,否则为指定种类。

换句话说,我只看到一个换行符而不是结果。它不应该告诉我形状是 1 吗?

fortran gfortran fortran95

1
推荐指数
1
解决办法
118
查看次数

与 gfortran 链接时未定义对 `std::chrono::_V2::system_clock::now()' 的引用

我正在尝试在 INSEL 中创建一个用户定义的块,它需要 C++ 进行编程,并使用 gfortran 链接它。

我的程序中有以下代码

// Setting seed for random number generators
unsigned seed = static_cast<int> (std::chrono::system_clock::now().time_since_epoch().count());
Run Code Online (Sandbox Code Playgroud)

设置为我的随机数生成器的种子。当我使用 g++ (gcc v.5.1.0) 编译它时,它没有显示错误或警告。我的编译命令是

g++ -O0 -Wall -c -g3 -std=c++14 -fmessage-length=0 $(sourcesC)
Run Code Online (Sandbox Code Playgroud)

sourcecC 有我所有的 .cpp 程序。但是当我尝试使用 gfortran 将其链接到:

gfortran -shared -o C:\***\inselUB.dll -Wall -L./ -linselTools $(objects) 
Run Code Online (Sandbox Code Playgroud)

我收到错误:

C:***\resources/../src/constants.h:54: 对 `std::chrono::_V2::system_clock::now()' 的未定义引用

collect2.exe:错误:ld 返回 1 退出状态 makefile:11:目标“inselUB”的配方失败

make: *** [inselUB] 错误 1

我只是这种类型接口的初学者。可能是一个简单的错误。有人能给我建议一个解决方案吗?

操作系统:Win 7

c++ linker fortran gfortran c++14

1
推荐指数
1
解决办法
9352
查看次数

无法使用 gfortran 打开模块文件

我正在使用 gfortran 运行 .F90 代码,但出现两个错误,

\n\n
program fhello_world_mpi.F90\n   1\nError: Invalid form of PROGRAM statement at (1)\nfhello_world_mpi.F90:2:6:\n\n   use mpi\n       1\n Fatal Error: Can\'t open module file \xe2\x80\x98mpi.mod\xe2\x80\x99 for reading at (1): \n No such file or directory\n compilation terminated.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我检查了mpi安装库(系统中存在mpich、openmpi库)。

\n\n

程序如下:

\n\n
program fhello_world_mpi.F90\n  use mpi\n  implicit none\n   integer ( kind = 4 ) error\n   integer ( kind = 4 ) id\n   integer p\n   character(len=MPI_MAX_PROCESSOR_NAME) :: name\n   integer clen\n   integer, allocatable :: mype(:)\n   real ( kind = 8 ) …
Run Code Online (Sandbox Code Playgroud)

fortran compiler-errors compilation mpi gfortran

1
推荐指数
1
解决办法
6620
查看次数

这个语法在fortran中是什么意思?

我正在做一个项目,因为我以前没有用 Fortran 编码,所以我很挣扎。我的教授给了我一个代码文件,我需要修复它,但我不明白语法。

所以,在他的文件中

         g = some formula,
     1        some formula
     2        * some formula
     3        / some formula.
Run Code Online (Sandbox Code Playgroud)

1, 2, 3, * 和 / 有什么作用?

我问过我的教授,他说这是 Fortran 77 代码,1、2、3 用作第 6 列中的索引,g 在第 7 列中,因为这就是 Fortran 代码的编写方式。但我很困惑为什么 Fortran 77 只接受第 7 列之后的代码?

谢谢大家的回复。

fortran gfortran

1
推荐指数
1
解决办法
238
查看次数

我怎样才能编译这个旧的 Fortran 代码?

我正在尝试编译 80 年代后期在DEC操作系统上编写和编译的 Fortran 代码。我不确定代码是用什么版本的 Fortran 编写的。

我在macOSversion 上10.14.6,并使用gfortranversion 8.2.0

当我尝试在命令行上编译时:

gfortran -v -fdec- o test CODE.FOR

我收到以下错误:

CODE.FOR:1618:72:

CODE.FOR: 1599:72:

CODE.FOR:1618.72:

Error: Variable 'j' at (1) cannot be redefined inside loop beginning at (2)
Run Code Online (Sandbox Code Playgroud)

当我查看 1618 行时,我看到: J=J-1,它在一个DO循环内。

代码是否太旧以至于它曾经在较旧的编译器上编译,但现在gfortran不允许jDO循环中更改变量?

      DO 10 J=1,NMAX
      WRITE(6,*)' Give STA NAME, COMP(Z, R, or T), and WAVE TYPE (P, SV,
     * or SH)'
      WRITE(6,*)' Enter blanks …
Run Code Online (Sandbox Code Playgroud)

fortran compiler-errors gfortran

1
推荐指数
1
解决办法
87
查看次数

通过带有 gfortran 的 mpi_f08 模块支持 MPI Fortran

我有一些 Fortran 代码,我想与 MPI 并行。显然,在 Fortran 中使用 MPI(在我的情况下为 MPICH)的推荐方法是通过mpi_f08模块(关于这个问题的 mpi-forum 条目),但我无法使它工作,因为根本没有创建相应的 mod 文件(与mpi.mod,它的工作原理不同)很好,但它不是最新的 Fortran 标准)。这个讨论给我留下的印象是 gfortran 无法构建 F08 绑定。您可以在下面看到我的配置,gfortran 和 mpich 都已通过 apt install 在 ubuntu 上安装,并且应该是最新的。我不确定一些事情:

  • 有什么方法可以使 Fortran 2008 MPI 语法与 gfortran 一起使用?从我遇到的情况来看,答案似乎是否定的,但希望有人可能知道解决方法。我对此不太精通,因此将不胜感激任何相关链接或更多入门级解释。
  • 可以使用不同的编译器帮助吗?英特尔编译器* 也许?如果合理,我宁愿坚持使用 gfortran。
  • 也许与当前标准的一致性并不是什么大问题。根据您的经验,通过 mpi.mod 模块获得支持会更好吗?那时我会遇到什么问题?我的应用程序没有太大的长远目标,所以如果它现在可以正常工作,那么一段时间后失去支持也不是什么大问题。

编辑

使用过时版本的 gfortran 似乎是个问题。这将我的问题简化为如何使用 gfortran-10 构建 MPICH。


* 因此 [intel-fortran] 标签,如果您认为它多余,请随意删除它

为了清楚起见,有我的 gfortran 和 mpich 配置

pavel@pavel:~$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v …
Run Code Online (Sandbox Code Playgroud)

fortran mpi gfortran fortran-iso-c-binding intel-fortran

1
推荐指数
1
解决办法
369
查看次数

如何在 Fortran 中将 real(kind=8) 类型的数组正确转换为 real(kind=4) 类型之一

这个问题适用于 Fortran,更准确地说是编译器 gfortran。

我需要知道如何将 real(kind=8) 数组转换为 real(kind=4) 数组,以便保留数组每个条目中的所有合理数字。

显然,从 kind=8 到 kind=4 的类型转换意味着信息丢失。因此,我正在寻找的是丢失尽可能多的信息的正确方法 - 但不是更多。

fortran types casting gfortran

1
推荐指数
1
解决办法
85
查看次数

gfortran编译器调用递归log_gamma函数时出错

我上传了一个 2F1 超几何函数,但结果发现它无法在我的计算机上编译。是出自这篇文章。我用

GNU Fortran (Built by Jeroen for the R-project) 8.3.0
Run Code Online (Sandbox Code Playgroud)

随 RTools 4.0 一起提供。你能找出为什么它不能编译以及如何解决这个问题吗?在下面的代码中,我只保留了生成错误的一行。接下来给出错误。

MODULE HYP_2F1_MODULE
  !--------------------------------------------------------------------
  IMPLICIT NONE
  INTEGER, PARAMETER :: PR=KIND(1.0D0)
  REAL(PR)     ::  ONE=1.0D0
CONTAINS
  !
END MODULE HYP_2F1_MODULE
!
!----------------------------------------------------------------------
RECURSIVE FUNCTION LOG_GAMMA(Z) RESULT(RES)

  USE HYP_2F1_MODULE
  IMPLICIT NONE
  COMPLEX(PR),INTENT(IN) :: Z
  COMPLEX(PR)  :: RES
  !
     RES = LOG_GAMMA( ONE -z);
  !
END FUNCTION LOG_GAMMA
Run Code Online (Sandbox Code Playgroud)

这是错误消息

 testZ.f90:18:22:

      RES = LOG_GAMMA( ONE - Z);
                 1
Error: 'x' argument of 'log_gamma' intrinsic at (1) must be …
Run Code Online (Sandbox Code Playgroud)

fortran gfortran

1
推荐指数
1
解决办法
128
查看次数