【发布时间】:2015-04-10 18:46:17
【问题描述】:
我正在尝试使用 Fortran 程序编译并链接到 HDF5,但出现运行时错误。我已密切遵循此问题的答案中描述的程序
Use HDF5 from intel fortran on windows
我在环境变量中设置了 PATH,而不是在 Visual Studio 中设置它们。我将所有生成的 .mod 和 .lib 文件移动到我的项目文件夹中的 mod 和 lib 文件夹中。
在命令提示符下,我的编译器配置如下所示
gfortran --version
GNU Fortran (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 4.9.2
gmake --version
GNU Make 3.81
我的 makefile 看起来像
ifdef SystemRoot
PATHSEP2 = \\
else
PATHSEP2 = /
endif
PS = $(strip $(PATHSEP2))
OBJ_DIR = obj
MOD_DIR = mod
LIB_DIR = lib
FC = gfortran
FCFLAGS = -I$(MOD_DIR) -g -Wall
FLFLAGS = -I$(MOD_DIR) -L$(LIB_DIR) -l$(LIB_DIR)hdf5_fortran
SRCS_F = testHDF5.f90
TARGET = testHDF5
all: $(TARGET)
testHDF5: testHDF5.f90
$(FC) -o $@ testHDF5.f90 $(FLFLAGS)
$(OBJ_DIR)$(PS)%.o: %.f90
$(FC) $(FCFLAGS) -c -o $@ $<
由于我在这里阅读的内容,我已将 hdf5_fortran.lib 更改为 libhdf5_fortran.lib
http://www.mingw.org/wiki/specify_the_libraries_for_the_linker_to_use
当我运行 gmake 时,我得到了
gfortran -o testHDF5 testHDF5.f90 -Imod -Llib -llibhdf5_fortran
当我尝试运行可执行文件时,会弹出一个窗口,显示“应用程序无法正确启动 (0xc000007b)。单击确定关闭应用程序。”
这个链接
建议是32位到64位不兼容造成的。我使用的是 64 位机器,我确实下载了 32 位版本的 CMake,但这只是因为似乎没有 64 位机器的可用版本。另外,这个链接
http://www.cmake.org/pipermail/cmake/2010-September/039375.html
建议它应该不重要。所以我的问题是,我哪里出错了?到目前为止,我所展示的内容是否存在明显错误?
更新:
我发现运行时错误是由于未指定路径,在本例中为 HDF5_DIR。在 USING_HDF5_CMAKE 文档中,它说要指定环境变量
HDF5_DIR=C:/Program Files/HDF_Group/HDF5/1.8.x/cmake/hdf5
这解决了应用程序一开始就崩溃的问题。但是现在,我得到了错误
HDF5-DIAG: Error detected in HDF5 (1.8.14) thread 0:
#000: C:\Users\Charlie\Downloads\CMake\hdf5-1.8.14\src\H5D.c line 167 in H5Dcr
eate2(): not a datatype ID
major: Invalid arguments to routine
minor: Inappropriate type
HDF5-DIAG: Error detected in HDF5 (1.8.14) thread 0:
#000: C:\Users\Charlie\Downloads\CMake\hdf5-1.8.14\src\H5D.c line 415 in H5Dcl
ose(): not a dataset
major: Invalid arguments to routine
minor: Inappropriate type
我猜是第一个错误
HDF5-DIAG: Error detected in HDF5 (1.8.14) thread 0:
#000: C:\Users\Charlie\Downloads\CMake\hdf5-1.8.14\src\H5D.c line 167 in H5Dcr
eate2(): not a datatype ID
major: Invalid arguments to routine
minor: Inappropriate type
是最重要的,因为它可能会触发后面的。根据这个线程
建议使用与构建 fortran 源代码相同的编译器来构建库(如果我没记错的话)。在使用 CMake 构建期间,我指定使用 MinGW,我相信在两个构建期间都会使用它,对吗?
再次感谢您对此提供的任何帮助。
【问题讨论】:
标签: compilation makefile linker fortran gfortran