首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接静态HDF5 Fortran库

链接静态HDF5 Fortran库
EN

Stack Overflow用户
提问于 2016-02-10 06:09:55
回答 1查看 1.7K关注 0票数 0

所以我有一个小的Fortran库,它为HDF5 Fortran调用提供了一些包装器。我还有一个小测试,它调用库中定义的接口。我知道问题出在我链接HDF5的方式上。我已经检查了我的HDF5版本(特别是1.8.15-patch1),确保它都正确安装到我的机器上,并且在我的机器上没有备用的版本。我正在使用设置为gcc-5、g++-5和gfortran-5的编译器构建这两个项目。

我使用CMake 3.2.2来生成makefile。

项目的布局如下所示:

代码语言:javascript
复制
CMakeLists.txt
test
 |_____ CMakeLists.txt
 |_____ dump_test.f90
src
 |_____ data
         |_____ CMakeLists.txt
         |_____ dump_data.f90
 |_____ <other libraries>

在主CMakeLists.txt中,我有

代码语言:javascript
复制
project(testlibs)

ENABLE_LANGUAGE(Fortran)

SET(HDF5_USE_STATIC_LIBRARIES ON)
find_package(HDF5 COMPONENTS C CXX Fortran REQUIRED)

SET(CMAKE_Fortran_FLAGS_DEBUG "-g -O0 -DDEBUG")

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib)

add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/src/data)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tests)

在数据库CMakeLists.txt中,我有

代码语言:javascript
复制
include_directories(${HDF5_INCLUDE_DIRS})
add_library(dumpData STATIC ${CMAKE_CURRENT_LIST_DIR}/dump_data.f90)
target_link_libraries(dumpData hdf5 hdf5_fortran )
install(TARGETS dumpData DESTINATION ${CMAKE_INSTALL_RPATH})

在测试CMakeLists.txt中,我有

代码语言:javascript
复制
include_directories(${HDF5_INCLUDE_DIRS})
include_directories("${PROJECT_BINARY_DIR}/src/data")
add_executable(dumptest EXCLUDE_FROM_ALL dump_test.f90)
target_link_libraries(dumptest dumpData)

我也看到有人建议将库链接到dl上,但这似乎不会影响任何事情。

当我构建这个库时,我没有得到任何错误,但是当我构建这个示例时,我得到了一堆未定义的引用

代码语言:javascript
复制
//usr/local/lib/libhdf5_fortran.a(H5_ff.f90.o): In function `__h5lib_MOD_h5dont_atexit_f':
H5_ff.f90:(.text+0xed): undefined reference to `h5dont_atexit_c_'
//usr/local/lib/libhdf5_fortran.a(H5_ff.f90.o): In function `__h5lib_MOD_h5garbage_collect_f':
H5_ff.f90:(.text+0x109): undefined reference to `h5garbage_collect_c_'
//usr/local/lib/libhdf5_fortran.a(H5_ff.f90.o): In function `__h5lib_MOD_h5check_version_f':
H5_ff.f90:(.text+0x143): undefined reference to `h5check_version_c_'
//usr/local/lib/libhdf5_fortran.a(H5_ff.f90.o): In function `__h5lib_MOD_h5get_libversion_f':
H5_ff.f90:(.text+0x17d): undefined reference to `h5get_libversion_c_'
//usr/local/lib/libhdf5_fortran.a(H5_ff.f90.o): In function `__h5lib_MOD_h5close_f':
H5_ff.f90:(.text+0x1cc): undefined reference to `h5close_types_c_'
//usr/local/lib/libhdf5_fortran.a(H5_ff.f90.o): In function `__h5lib_MOD_h5open_f':
H5_ff.f90:(.text+0x20a): undefined reference to `h5init_types_c_'
H5_ff.f90:(.text+0x2ba): undefined reference to `h5init_flags_c_'
H5_ff.f90:(.text+0x2d0): undefined reference to `h5init1_flags_c_'

我的CMake文件中是否遗漏了什么?我发现这是一个HDF5 Fortran函数找不到底层C函数的问题。

EN

回答 1

Stack Overflow用户

发布于 2019-03-06 06:03:02

我正在做类似的事情,并且有相同的错误消息(参见下面的小摘录)。我在主文件夹中有一个CMakeLists.txt,它负责构建用于几个可执行程序的静态和共享库的add_subdirectory( src ),以及用于构建和链接可执行程序的add_subdirectory( apps )。以下是错误消息的示例:

代码语言:javascript
复制
Faults/src/HDMod.f90:90: undefined reference to `__h5global_MOD_h5f_acc_trunc_f'
Faults/src/HDMod.f90:90: undefined reference to `__h5f_MOD_h5fcreate_f'
Faults/src/HDMod.f90:90: undefined reference to `__h5global_MOD_h5f_acc_rdwr_f'
Faults/src/HDMod.f90:90: undefined reference to `__h5f_MOD_h5fopen_f'
../lib/libFaultsStatic.a(HDMod.f90.o): In function `__hdmod_MOD_hd_open':

主CMakeLists.txt有以下几行代码(仅限摘录,因为还有更多的代码行没有显示):

代码语言:javascript
复制
cmake_minimum_required (VERSION 3.12 FATAL_ERROR)
project( Faults_Project Fortran C )
set( HDF5_USE_STATIC_LIBRARIES ON )
find_package( MPI REQUIRED )
find_package( HDF5 COMPONENTS C Fortran REQUIRED )
include_directories( SYSTEM ${HDF5_INCLUDE_DIRS} )
set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}" )
add_subdirectory( src )
add_subdirectory( apps )

src文件夹的CmakeLists.txt从源代码创建静态库和共享库:

代码语言:javascript
复制
add_library( FaultsShared SHARED ${Faults_Src_Code} )
set_target_properties( FaultsShared PROPERTIES LINKER_LANGUAGE Fortran )
set_target_properties( FaultsShared PROPERTIES LINK_FLAGS "${MPI_LINK_FLAGS}" )
set_target_properties( FaultsShared PROPERTIES Fortran_FORMAT "FREE" )
install( TARGETS FaultsShared RUNTIME DESTINATION ../bin/ LIBRARY DESTINATION ../lib/ ARCHIVE DESTINATION ../lib/ )

对于STATIC库也是如此。然后在apps文件夹的CMakeLists.txt中:

代码语言:javascript
复制
add_executable( artsRun artsRun.f90 )
target_link_libraries( artsRun FaultsStatic ${HDF5_Fortran_LIBRARIES} )

对于其他可执行程序,依此类推。诀窍是在target_link_libraries行中包含${HDF5_Fortran_LIBRARIES}

我之所以在这里张贴这篇文章,是因为看起来很多人都看过这个问题,但3年后仍然没有答案。希望这篇文章能帮助其他人寻找同样的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35303199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档