对"gemmkernel_"的未定义引用 - 从 Fortran 调用C++例程

undefined reference to `gemmkernel_'--C++ routine called from Fortran

本文关键字:Fortran 调用 C++ 例程 引用 gemmkernel 未定义      更新时间:2023-10-16

我一直在编写一个调用c++方法的Fortran例程。当我尝试创建它时,我得到以下错误:

make -f makefile_gcc
错误:

<>之前gfortran -O3 -o tgemm tgemm。o定时器。o dgemmf。0 -lblas -dgemmkerneldgemmf。在函数' dgemmf_'中:ggemmf .f:(.text+0x135):对' gemkernel_ '的未定义引用Collect2: ld返回1退出状态make: *** [tgemm] Error之前

这是我的makefile:

  `FC=gfortran
    CC=gcc
    FFLAGS = -O3
    CFLAGS = -O5
    BLASF=dgemmf.o
    BLASFSRC=dgemmf.f
    TIMER=mytimer.o
    TGEMM=tgemm
    ALL= $(TGEMM)
    LIBS = -lblas -dgemmkernel.o
    all: $(ALL)
    $(TGEMM): dgemmkernel.o tgemm.o $(TIMER) $(BLASF)
        $(FC) $(FFLAGS) -o $(TGEMM) tgemm.o $(TIMER) $(BLASF) $(LIBS)
    dgemmkernel.o: dgemmkernel.cpp  
        $(CC) $(CFLAGS) -c dgemmkernel.cpp
    tgemm.o: tgemm.f $(INCLUDE)
        $(FC) $(FFLAGS) -c tgemm.f
    clean:
        rm -rf *.o $(ALL) 

下面是我的Fortran代码:

<>之前子程序dgemmf (transa, transb, m, n, k, alpha, a, lda, b, ldb,$ beta, c,最不发达国家)* . .标量参数..字符*1转换,转换整数m, n, k, lda, ldb, LDC双精度* . .数组参数…双精度a (lda, *), b (ldb, *), c (ldc, *)* . .外部功能…逻辑 LSAME外部 LSAME* . .局部标量…逻辑上没有,没有整数i, j, l* . .参数. .双精度1,0参数(1 = 1.0d +0, 0 = 0.0d +0)* . .* . .可执行语句…**设置NOTA和nob为真,如果A和B分别没有转置*Nota = lsame (trans, ' n ')nob = lsame (transb, ' n ')*我们只想要C = A°B*如果((ALPHA.NE.ONE)支。(BETA.NE.ZERO)支。$ (. not . nota). or .(. not . notb))停止**启动操作。调用gemmkernel(M, N, K, A, LDA, B, LDB, C, LDC)返回* DGEMM结束。*结束之前

这里是我想调用的c++位

 void gemmkernel_(int * M, int * N, int * K,
                    double * a, int * LDA, 
                    double * b, int * LDB,
                    double * c, int * LDC) 

所有的.o文件都被创建了,但是可执行文件从未完成。我怀疑这个错误与我的makefile有关,因为到目前为止我找到的每个源都向我表明我的Fortran/c++代码是正确的。

您的make在链接时失败。dgemmkernel。0应该在目标文件列表中。我假设你想要这一行:

$(FC) $(FFLAGS) -o $(TGEMM) tgemm.o $(TIMER) $(BLASF) $(LIBS)

:

$(FC) $(FFLAGS) -o $(TGEMM) tgemm.o dgemmkernel.o $(TIMER) $(BLASF) $(LIBS)

LIBS = -lblas -dgemmkernel.o    

:

LIBS = -lblas