【发布时间】:2016-05-20 02:18:43
【问题描述】:
所以我有一个小型 Fortran 库,它为 HDF5 Fortran 调用提供了一些包装器。我还有一个小测试,它调用库中定义的接口。我知道问题在于我链接 HDF5 的方式。我检查了我的 HDF5 版本(特别是 1.8.15-patch1),确保它全部正确安装到我的机器上,并且我的机器上没有替代版本。我正在使用设置为 gcc-5、g++-5 和 gfortran-5 的编译器构建这两个项目。
我正在使用 CMake 3.2.2 生成 makefile。
项目的布局是这样的:
CMakeLists.txt
test
|_____ CMakeLists.txt
|_____ dump_test.f90
src
|_____ data
|_____ CMakeLists.txt
|_____ dump_data.f90
|_____ <other libraries>
在主 CMakeLists.txt 中,我有
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中,我有
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中,我有
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 链接的建议,但这似乎没有任何影响。
我在构建库时没有收到任何错误,但是在构建示例时,我得到了一堆未定义的引用
//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 函数的问题。
【问题讨论】:
-
我不是 CMake 用户,但看起来您对
hdf和hdf5_fortran库的顺序错误。我很确定hdf5_fortran应该是第一个 -
我最初有这个,但为了让它工作,我把它们换了。无论顺序如何,问题仍然存在。不过还是谢谢你的建议。
-
你想看看链接器试图做什么。看看链接是如何完成的。尝试使用
/usr/bin/h5fc -noshlib ...直接编译,看看有什么区别。 -
谢谢!这帮助我找到了问题。我没有链接 hdf5_f90cstub 库,这就是为什么它从 Fortran 文件中获得对 C 函数的未定义引用的原因。这将链接行更改为:target_link_libraries(dumpData hdf5_fortran hdf5_f90cstub hdf5 dl)。再次感谢!
标签: cmake fortran static-libraries gfortran hdf5