Linux Fortran中的排序,未定义对qsort的引用_
我是fortran和Linux的初学者。我在Linux上运行了一个名为Linux Fortran中的排序,未定义对qsort的引用_,linux,fortran,Linux,Fortran,我是fortran和Linux的初学者。我在Linux上运行了一个名为demo.f90的简单fortran程序。然后发生了一个错误,如下所示 /tmp/cckAhxOW.o: In function `MAIN__': demo.f90:(.text+0x25): undefined reference to `qsort_' 代码附在下面 program trand external compar integer*2 compar INTEGER*4 array(10)/5,1,9,0
demo.f90
的简单fortran程序。然后发生了一个错误,如下所示
/tmp/cckAhxOW.o: In function `MAIN__':
demo.f90:(.text+0x25): undefined reference to `qsort_'
代码附在下面
program trand
external compar
integer*2 compar
INTEGER*4 array(10)/5,1,9,0,8,7,3,4,6,2/,l/10/,isize/4/
call qsort( array, l, isize, compar )
write(*,'(10i3)') array
end program trand
integer*2 function compar( a, b )
INTEGER*4 a, b
if ( a .lt. b ) compar = -1
if ( a .eq. b ) compar = 0
if ( a .gt. b ) compar = 1
return
end function compar
qsort
不是内置子例程(也称为内部子例程)
您需要告诉程序在哪里可以找到它,例如,通过加载包含此子例程的模块(请参见
使用关键字)。尝试包括“libfui.a”库您最好将比较放入模块并使用它。这种方法将允许编译器检查子例程调用与其声明之间的一致性。如果主程序和模块在同一个文件中,请将模块放在第一位
module MySubs
contains
integer*2 function compar( a, b )
...
end function compar
end module MySubs
program trand
use MySubs
use SomeMod
....
end program trand
其中SomeMod
是另一个文件SomeMod.f90中的模块,带有排序例程qsort。然后编译并链接:
gfortran SomeMod.f90 trand.f90
或者您正在使用的任何编译器和文件名。带有qsort
的文件需要在带有program trand
的文件之前qsort
实际上是一个C标准库函数。您必须声明它的接口。事情是这样的:
module Sort
use iso_c_binding
implicit none
interface
subroutine qsort(array,elem_count,elem_size,compare) bind(C,name="qsort")
import
type(c_ptr),value :: array
integer(c_size_t),value :: elem_count
integer(c_size_t),value :: elem_size
type(c_funptr),value :: compare !int(*compare)(const void *, const void *)
end subroutine qsort !standard C library qsort
end interface
end module Sort
program trand
use Sort
external compar
integer(c_int) compar
integer(c_int),target :: array(10) = [5,1,9,0,8,7,3,4,6,2]
integer(c_size_t) l/10/,isize/4/
call qsort( c_loc(array(1)), l, isize, c_funloc(compar) )
write(*,'(10i3)') array
end program trand
integer(c_int) function compar( a, b ) bind(C)
use iso_c_binding
integer(c_int) a, b
if ( a .lt. b ) compar = -1
if ( a .eq. b ) compar = 0
if ( a .gt. b ) compar = 1
end function compar
然后像你那样编译。使用gfortran 4.8测试成功。您没有将程序链接到包含qsort@user3163883如何构建?@user3163883您可以看看gfortran demo.f90-o demoThis对我这样的初学者来说太复杂了。“libfui.a”库是Oracle Fortran编译器运行库的一部分。我真的不建议将其与gfortran一起使用。你也可以使用Oracle编译器。我不相信单凭这一点就能有所帮助。看我的答案。我假设问这个问题的人有qsort的Fortran源代码。如果不是,这不是初学者的问题。