【问题标题】:Gfortran and Undefined reference to '__[module_name]_MOD_[function_name]'Gfortran 和未定义的对 '__[module_name]_MOD_[function_name]' 的引用
【发布时间】:2015-01-15 12:57:29
【问题描述】:

我正在用 Fortran 编写一个程序,它使用 .mod 文件、.dll 库和 .h 头文件。

当我调用编译器时,我一定忘记了一些东西,因为我得到了错误: 未定义对 '__[module_name]_MOD_[function_name]' 的引用,其中 [module_name] 是主程序使用的模块之一的名称,而 [function_name] 是模块中包含的函数的名称。

唯一的源文件叫做 MAIN.f90:

! WORHP workspace access macros
#include "worhp/macros.h"

MODULE WORHP_INTERFACE

  USE std
  USE problem_definition_tools

CONTAINS

  SUBROUTINE OBJ(N,X,F) BIND(C)
    INTEGER(WORHP_INT)  :: N
    REAL(WORHP_DOUBLE)  :: X(N),F
    INTENT(in)          :: N, X
    INTENT(out)         :: F
    F = X(1)
  END SUBROUTINE OBJ

  SUBROUTINE CON(N,M,X,G) BIND(C)
    INTEGER(WORHP_INT)  :: N,M
    REAL(WORHP_DOUBLE)  :: X(N),G(M)
    INTENT(in)          :: N, M, X
    INTENT(out)         :: G
    TYPE (orbit)        :: O
    O = final_orbit(X)
    G = [O%Lp, O%La]
  END SUBROUTINE CON

  SUBROUTINE DOBJ(N,dfnnz,DFROW,X,DF) BIND(C)
    INTEGER(WORHP_INT)  :: N,dfnnz,DFROW(DFnnz)
    REAL(WORHP_DOUBLE)  :: X(N),DF(DFnnz)
    INTENT(in)          :: N, DFnnz, DFrow, X
    INTENT(out)         :: DF
    DF = [1, 0, 0, 0, 0, 0]
  END SUBROUTINE DOBJ

  SUBROUTINE DCON(N,M,DGnnz,DGROW,DGCOL,X,DG) BIND(C)
    INTEGER(WORHP_INT)  :: N,M,DGnnz,DGROW(DGnnz),DGCOL(DGnnz)
    REAL(WORHP_DOUBLE)  :: X(N),DG(DGnnz)
    INTENT(in)          :: N,M,DGnnz,DGrow,DGcol,X
    INTENT(out)         :: DG
    ! Dummy
  END SUBROUTINE DCON

  SUBROUTINE HESS(N,M,HMnnz,HMrow,HMcol,X,Mu,HM) BIND(C)
    INTEGER(WORHP_INT)  :: N, M, HMnnz, HMrow(HMnnz), HMcol(HMnnz)
    REAL(WORHP_DOUBLE)  :: X(N),Mu(M),HM(HMnnz)
    INTENT(in)          :: N, M, HMnnz, HMrow, HMcol, X, Mu
    INTENT(out)         :: HM
    ! Dummy
  END SUBROUTINE HESS

END MODULE WORHP_INTERFACE

program MAIN

  USE WORHP_INTERFACE
  USE Worhp_User

  INTEGER (WORHP_INT) :: Mode, N, M, DFnnz, DGnnz, HMnnz
  PARAMETER (N=6, M=2, DFnnz=1, DGnnz=12, HMnnz=12)
  INTEGER (WORHP_INT) :: DFrow(DFnnz), DGrow(DGnnz), DGcol(DGnnz)
  INTEGER (WORHP_INT) :: HMrow(HMnnz), HMcol(HMnnz)
  INTEGER (WORHP_INT) :: Iparam(10)
  REAL (WORHP_DOUBLE) :: X(N), L(N+M), U(N+M), Dparam(10)
  REAL (WORHP_DOUBLE) :: Infty = 1d20

  ! Check Version of library and header files
  CHECK_WORHP_VERSION

  L = [9000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 200000.0, 35786000.0]
  U = [10000.0, 5.0, 180.0, 0.15, 180.0, 0.15, 200000.0, 35786000.0]

  X = [9520.00, 1.47490136, 71.50755639, 0.09948622, 97.00248532, 0.09296147]

  DFrow = [6]
  DGrow = [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
  DGcol = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6]
  HMrow = [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
  HMcol = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6]

  ! Get default parameter values
  Mode = 0

  CALL WorhpSimple(Mode, N, M, X, L, U, Dparam, Iparam, &
       DFnnz, DFrow, DGnnz, DGrow, DGcol, HMnnz, HMrow, HMcol, &
       OBJ, CON, DOBJ, DCON, HESS)

  ! User-defined derivatives are available
  Iparam(1) = 1
  Iparam(2) = 0
  Iparam(3) = 0

  ! Run the solver
  Mode = 1

  CALL WorhpSimple(Mode, N, M, X, L, U, Dparam, Iparam, &
       DFnnz, DFrow, DGnnz, DGrow, DGcol, HMnnz, HMrow, HMcol, &
       OBJ, CON, DOBJ, DCON, HESS)

end

子程序CON调用的函数final_orbit包含在模块“problem_definition_tools”中。

对于编译,我使用以下名为“compile.bat”的 Windows 批处理文件

x86_64-w64-mingw32-gfortran src\MAIN.f90 -cpp -Iinclude -Ifinclude\worhp -Ifinclude\aerospace -Jobj -Lbin -lworhp -o bin\megaceppa.exe

这给出了错误

undefined reference to '__problem_definition_tools_MOD_final_orbit'

我从具有以下结构的目录“Test”运行命令

  • \bin\
    • libworhp.dll
  • \f包括
    • \worhp\
      • std.mod
    • \航空\
      • problem_definition_tools.mod
  • \包括
    • \worhp\
      • 宏.h
  • \库
    • libworhp.lib
  • \obj
    • worhp_interface.mod
  • \src
    • MAIN.f90
  • compile.bat

我想指定模块“problem_definition_tools”是我编写的,并且我确信它可以工作,因为我已经在另一个程序中使用过它。此外,我用 x86_64-w64-mingw32-gfortran 重新编译它以避免与该程序的任何兼容性问题。

我确信我调用编译器的方式有问题,但由于我对 Fortran 的经验有限,我无法弄清楚。我也尝试在这个网站上搜索类似的问题,但我找不到与我的问题密切相关的任何内容。

【问题讨论】:

  • 不知道,应该在“obj”目录吧?
  • 我刚刚测试了一个不使用“problem_definition_tools”模块的更简单版本的程序。相同的批处理文件编译没有任何错误,但它也不会在任何目录中生成任何目标文件。我不知道为什么即使正确编译后也没有目标文件...
  • 再次检查并搜索我的整个计算机后,我可以确认没有目标文件的痕迹。难道是编译器创建了一些临时对象文件,然后在编译后将它们删除?
  • 令人惊讶的是只生成了一个.mod 文件。但并非不可能。当模块为used 时,不需要总是需要目标文件/库。那么,你能显示模块的编译吗?虽然它不是我选择的系统或编译器,所以我可能帮不上什么忙。
  • 我通过在编译中包含源文件problem_definition_tools.f90 解决了问题,现在一切编译完美。奇怪的是,即使这个编译也不会产生任何.o.obj 文件,但只要它有效,我不在乎!感谢您的帮助!

标签: fortran gfortran fortran90 worhp


【解决方案1】:

我认为这可能与final_orbit 函数的某些声明有关。

似乎接近以下问题:

Linking fortran module: "undefined reference"

而且我认为问题应该出在模块problem_definition_tools的代码中

【讨论】:

  • 相关性是完全明显的。问题是真正的问题在哪里,OP 知道哪个模块有问题。链接的问题不相关,它谈到了对外部函数的未定义引用,而不是模块函数。
猜你喜欢
  • 1970-01-01
  • 2016-05-02
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2015-11-29
相关资源
最近更新 更多