如何解决使用OpenBLAS时未解析对dgemm的引用
一段时间以来,我一直在尝试编译和链接OpenBLAS lib,以便使用dgemm将它们乘以矩阵。使用pacman从MSYS2安装MSYS2和mingw64软件包后,我终于能够编译OpenBLAS。我的意图是将OpenBLAS用作静态库。所以我写了一个简单的fortran代码,使用dgemm将矩阵相乘。这是fortran代码:
program gcc_fun
implicit none
! Variables
real*8 x(2,2),y(2,z(2,2)
x(1,1) = 3.d0
x(2,1) = 2.d0
x(1,2) = 1.d0
x(2,2) = 4.d0
y(1,1) = .5d0
y(2,1) = 1.d0
y(1,2) = 2.d0
y(2,2) = .75d0
call dgemm( 'n','n',2,1,x,y,z,1)
! Body of gcc_fun
print *,'Z = ',z
end program gcc_fun
这是我的makefile,可以尝试链接:
CCC = gcc -g -Iincludem -Iincludev -c -O0
WARN = -Wall
CCCX = x86_64-w64-mingw32-g++ -m64 -s -Iincludem -Iincludev -c -O2 -DNDEBUG
fort = x86_64-w64-mingw32-gfortran -s -Iincludem -Iincludev -fno-underscoring -c -O2 -DNDEBUG
#fort = x86_64-w64-mingw32-gfortran -s -Iincludem -Iincludev -c -O2 -DNDEBUG
OBJECTS = \
obj/gcc_fun.o
#-----------------------------------------------------------------------------------
# Make the Guidance Object Library (GNC_Lib.a) and the Executable (guideUnitTest)
#-----------------------------------------------------------------------------------
gcc_fun.exe: $(OBJECTS)
x86_64-w64-mingw32-gfortran -o gcc_fun.exe -L./ -lopenblas_haswell-r0.3.10 $(OBJECTS)
#------------------------------------------
# object file targets
#------------------------------------------
obj/gcc_fun.o: \
gcc_fun.f90
$(fort) $(WARN) -o $@ gcc_fun.f90
我使用make -f makefile_name
运行make文件,并获得对dgemm的未解析引用。我尝试了有无强调选项都没有用。这是实际的错误:
$ make -f Makefile_gcc_fun.mak
x86_64-w64-mingw32-gfortran -s -Iincludem -Iincludev -fno-underscoring -c -O2 -DNDEBUG -Wall -o obj/gcc_fun.o gcc_fun.f90
f951.exe: Warning: Nonexistent include directory 'includem' [-Wmissing-include-dirs]
f951.exe: Warning: Nonexistent include directory 'includev' [-Wmissing-include-dirs]
gcc_fun.f90:27:2:
27 | x(2,1) = 2.d0
| 1
Warning: Nonconforming tab character at (1) [-Wtabs]
gcc_fun.f90:28:2:
28 | x(1,2) = 1.d0
| 1
Warning: Nonconforming tab character at (1) [-Wtabs]
gcc_fun.f90:29:2:
29 | x(2,2) = 4.d0
| 1
Warning: Nonconforming tab character at (1) [-Wtabs]
gcc_fun.f90:31:2:
31 | y(2,1) = 1.d0
| 1
Warning: Nonconforming tab character at (1) [-Wtabs]
gcc_fun.f90:32:2:
32 | y(1,2) = 2.d0
| 1
Warning: Nonconforming tab character at (1) [-Wtabs]
gcc_fun.f90:33:2:
33 | y(2,2) = .75d0
| 1
Warning: Nonconforming tab character at (1) [-Wtabs]
x86_64-w64-mingw32-gfortran -o gcc_fun.exe -L./ -lopenblas_haswell-r0.3.10 obj/gcc_fun.o
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: obj/gcc_fun.o:gcc_fun.f90:(.text+0xf5): undefined reference to `dgemm'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile_gcc_fun.mak:19: gcc_fun.exe] Error 1
当我用nm检查OpenBLAS库时,我得到了:
$ nm -g libopenblas_haswell-r0.3.10.a | grep dgemm
dgemm.obj:
0000000000000000 T dgemm_
因此dgemm似乎是一个外部对象,我应该可以调用它。我确信我缺少一些简单的东西,因此感谢您的帮助。
解决方法
子例程只是dgemm
,而不是dgemm_
。你就叫它
call dgemm()
使用nm
看到的符号名称可能因工具链(编译器,操作系统等)而异。如果您要实现不同编程语言的互操作性,那么这很重要。但是,如果您留在Fortran中,没有它就不必担心。
重要:
要链接的静态库应放在链接命令中使用该库的文件后 。只有这样才能解决依赖性。如果这是实际问题,我们将提供一些重复链接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。