使用 cmake 构建 Fortran 共享库时的奇怪问题
strange problem in building Fortran shared library with cmake
我正在尝试从以下 Fortran 代码 (util.f90
) 构建一个简单的示例共享库(使用 cmake):
module util
implicit none
type dummy
integer :: n
real, allocatable :: buff(:)
end type
contains
subroutine allocate_dummy(x, n)
implicit none
type(dummy), intent(out) :: x
integer, intent(in) :: n
x%n = n
allocate(x%buff(n))
end subroutine
subroutine print_dummy(x)
implicit none
type(dummy) :: x
integer :: i
if (allocated(x%buff)) then
write(*, *) x%n, x%buff, 'Sum:', sum(x%buff)
else
write(*, *) 'not allocated'
end if
end subroutine
end module
其中示例主程序(main.f90
)是
program main
use util
implicit none
type(dummy) :: x
call allocate_dummy(x, 3)
x%buff = 3.14
call print_dummy(x)
end program
因此库只是分配 x
并打印出来。
我使用以下 CMakeLists.txt
构建库和可执行文件
cmake_minimum_required(VERSION 3.10)
project(DUMMY)
enable_language(Fortran)
add_library(dumlib SHARED util.f90)
target_include_directories(dumlib INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
add_executable(a.out main.f90)
target_link_libraries(a.out dumlib)
但是 ./a.out
打印出
3 Sum: 9.42000008
应该在哪里打印
3 3.14000010 3.14000010 3.14000010 Sum: 9.42000008
直接编译(没有共享库),或者如果我手动构建库(没有 cmake),行为正确。但是使用 cmake 共享库, x%buff
不会被打印出来。由于 Sum:
已正确计算和打印,因此代码可以正常工作。
我想知道可能是什么问题?
编辑:
如果(在 write
语句中)我使用 (x%buff(j), j=1, n)
而不是 x%buff
,则问题已解决。但是,我仍然很好奇这种行为的原因。
编辑 2:
我的 Fortran 编译器是 gfortran(gcc 版本 9.3.0)。
经过一些检查,我认为这是由于 运行时间库不匹配造成的。为了编译代码,我使用了本地安装的 gfortran,但在 运行 期间,我认为 ld 从安装到 CONDA 环境的 gcc 中获取了一些库。
我正在尝试从以下 Fortran 代码 (util.f90
) 构建一个简单的示例共享库(使用 cmake):
module util
implicit none
type dummy
integer :: n
real, allocatable :: buff(:)
end type
contains
subroutine allocate_dummy(x, n)
implicit none
type(dummy), intent(out) :: x
integer, intent(in) :: n
x%n = n
allocate(x%buff(n))
end subroutine
subroutine print_dummy(x)
implicit none
type(dummy) :: x
integer :: i
if (allocated(x%buff)) then
write(*, *) x%n, x%buff, 'Sum:', sum(x%buff)
else
write(*, *) 'not allocated'
end if
end subroutine
end module
其中示例主程序(main.f90
)是
program main
use util
implicit none
type(dummy) :: x
call allocate_dummy(x, 3)
x%buff = 3.14
call print_dummy(x)
end program
因此库只是分配 x
并打印出来。
我使用以下 CMakeLists.txt
构建库和可执行文件
cmake_minimum_required(VERSION 3.10)
project(DUMMY)
enable_language(Fortran)
add_library(dumlib SHARED util.f90)
target_include_directories(dumlib INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
add_executable(a.out main.f90)
target_link_libraries(a.out dumlib)
但是 ./a.out
打印出
3 Sum: 9.42000008
应该在哪里打印
3 3.14000010 3.14000010 3.14000010 Sum: 9.42000008
直接编译(没有共享库),或者如果我手动构建库(没有 cmake),行为正确。但是使用 cmake 共享库, x%buff
不会被打印出来。由于 Sum:
已正确计算和打印,因此代码可以正常工作。
我想知道可能是什么问题?
编辑:
如果(在 write
语句中)我使用 (x%buff(j), j=1, n)
而不是 x%buff
,则问题已解决。但是,我仍然很好奇这种行为的原因。
编辑 2:
我的 Fortran 编译器是 gfortran(gcc 版本 9.3.0)。
经过一些检查,我认为这是由于 运行时间库不匹配造成的。为了编译代码,我使用了本地安装的 gfortran,但在 运行 期间,我认为 ld 从安装到 CONDA 环境的 gcc 中获取了一些库。