我想从第三方 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 不要添加下划线?
编辑:需要进行一些澄清。
Foo(1.0d0)出现undefined reference to '_foo_'链接错误当我声明一个字符串时:
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 键。
考虑以下短程序(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 中形状的文档说:
Run Code Online (Sandbox Code Playgroud)RESULT = SHAPE(SOURCE [, KIND])参数:
SOURCE 应为任何类型的数组或标量。如果 SOURCE 是一个指针,它必须被关联并且必须分配可分配的数组。返回值:
秩为 1 的 INTEGER 数组,其元素数与 SOURCE 的维数相同。结果数组的元素对应于 SOURCE 沿各自维度的扩展。如果 SOURCE 是标量,则结果是大小为零的排名一的数组。如果 KIND 不存在,则返回值具有默认整数种类,否则为指定种类。
换句话说,我只看到一个换行符而不是结果。它不应该告诉我形状是 1 吗?
我正在尝试在 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
我正在使用 gfortran 运行 .F90 代码,但出现两个错误,
\n\nprogram 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.\nRun Code Online (Sandbox Code Playgroud)\n\n我检查了mpi安装库(系统中存在mpich、openmpi库)。
\n\n程序如下:
\n\nprogram 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 编码,所以我很挣扎。我的教授给了我一个代码文件,我需要修复它,但我不明白语法。
所以,在他的文件中
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 列之后的代码?
谢谢大家的回复。
我正在尝试编译 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不允许j在DO循环中更改变量?
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 代码,我想与 MPI 并行。显然,在 Fortran 中使用 MPI(在我的情况下为 MPICH)的推荐方法是通过mpi_f08模块(关于这个问题的 mpi-forum 条目),但我无法使它工作,因为根本没有创建相应的 mod 文件(与mpi.mod,它的工作原理不同)很好,但它不是最新的 Fortran 标准)。这个讨论给我留下的印象是 gfortran 无法构建 F08 绑定。您可以在下面看到我的配置,gfortran 和 mpich 都已通过 apt install 在 ubuntu 上安装,并且应该是最新的。我不确定一些事情:
使用过时版本的 gfortran 似乎是个问题。这将我的问题简化为如何使用 gfortran-10 构建 MPICH。
为了清楚起见,有我的 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,更准确地说是编译器 gfortran。
我需要知道如何将 real(kind=8) 数组转换为 real(kind=4) 数组,以便保留数组每个条目中的所有合理数字。
显然,从 kind=8 到 kind=4 的类型转换意味着信息丢失。因此,我正在寻找的是丢失尽可能多的信息的正确方法 - 但不是更多。
我上传了一个 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)