问题描述
我有一个 Fortran 90 程序,它通过 FCVODE 接口调用 Sundials CVODE。 Sundials 是用 C 编写的,但它们提供了两个 Fortran 接口。一种接口用于 fortran 77 应用程序,一种使用现代 fortran 方法(iso_c_binding)。
我的代码使用了 fortran 77 接口(就这样结束了,我知道 iso_c_binding 会更好)
这是我的项目(开发分支):https://github.com/Nicholaswogan/PhotochemPy/tree/dev
我的目标是编写一个 CMakesLists.txt,一举编译所有的 fortran 和 C。我已经这样做了,但它仅适用于某些编译器组合和操作系统。例如,在带有 clang 12.0.5 和 gfortran 11.1.0 的 MacOS 上,一切都很好。但是,在 MacOS 上,当我切换到 gcc 11.1.0(而不是 clang)时,链接可执行文件时出现错误:
[ 98%] Building Fortran object CMakeFiles/photo.run.dir/src/main.f90.o
[100%] Linking Fortran executable photo.run
duplicate symbol '_F2C_CVODE_linsol' in:
lib/libsundials_fcvode.a(fsunlinsol_band.c.o)
lib/libsundials_fcvode.a(fcvnulllinsol.c.o)
duplicate symbol '_F2C_CVODE_matrix' in:
lib/libsundials_fcvode.a(fsunmatrix_band.c.o)
lib/libsundials_fcvode.a(fcvnullmatrix.c.o)
ld: 2 duplicate symbols for architecture x86_64
collect2: error: ld returned 1 exit status
make[2]: *** [photo.run] Error 1
make[1]: *** [CMakeFiles/photo.run.dir/all] Error 2
make: *** [all] Error 2
我查看了 libsundials_fcvode.a
和 libsundials_fcvode.a
,它们确实包含这些重复的符号。然而,当我用 clang + gfortran 编译时,这些库也有这些重复的符号,但是,在这种情况下,这些编译器似乎并没有被它打扰。
此外,在带有 gcc 9 和 gfortran 9 的 Ubuntu 20.04 上,我得到一个未定义的符号:
[ 98%] Building Fortran object CMakeFiles/photo.run.dir/src/main.f90.o
[100%] Linking Fortran executable photo.run
/usr/bin/ld: lib/libsundials_fcvode.a(fcvband.c.o): in function `FCVBandJac':
fcvband.c:(.text+0x141): undefined reference to `fcvbjac_'
/usr/bin/ld: lib/libsundials_fcvode.a(fcvode.c.o): in function `FCVf':
fcvode.c:(.text+0x50): undefined reference to `fcvfun_'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/photo.run.dir/build.make:91: photo.run] Error 1
make[1]: *** [CMakeFiles/Makefile2:711: CMakeFiles/photo.run.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
这个缺少的符号很令人费解,因为它没有丢失!我已经使用 nm
来查询我链接到的库,并且符号在那里:
...
cvode_funcs.f90.o:
0000000000000250 T fcvbjac_
0000000000000000 T fcvfun_
...
我的问题:CMakesList.txt 中缺少哪些常见项目会导致此类问题?或者在没有 iso_c_binding
的情况下混合 fortran 和 C 时一定会发生这种问题吗?
编辑:
我最终花时间从 fortran 77 接口切换到使用 iso_c_binding 的现代 fortran C 接口。我试过的每个编译器都有效。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)