2015-01-15 4 views
1

Я пишу программу в Fortran, которая использует файлы .mod, DLL-библиотеки и .h заголовки.Gfortran и Неопределенная ссылка на '__ [имя_компьютера] _MOD_ [имя_функции]'

Я должен забыть что-то, когда я вызываю компилятор, потому что я получаю ошибку: неопределенная ссылка на '__ [имя_компьютера] _MOD_ [имя_функции]', где [имя_компьютера] - это имя одного из модулей, используемых основная программа и [имя_функции] - это имя функции, содержащейся в модуле.

Единственный исходный файл называется 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 

Функция final_orbit называется подпрограммой CON содержится в модуле «problem_definition_tools».

Для компиляции я использую следующее окно пакетного файл под названием «compile.bat»

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'

Я запустить команду из каталога " Испытание ", которое имеет следующую структуру:

  • \ Bin \
    • libworhp.dll
  • \ finclude
    • \ worhp \
      • std.mod
    • \ аэрокосмических \
      • problem_definition_tools.mod
  • \ включают
    • \ worhp \
      • macros.h
  • \ Lib
    • libworhp.lib
  • \ OBJ
    • worhp_interface.mod
  • \ ЦСИ
    • MAIN.f90
  • компиляции.bat

Я хотел бы указать, что модуль «problem_definition_tools» написан мной, и я точно знаю, что он работает, потому что я уже использовал его в другой программе. Кроме того, я перекомпилировал его с помощью x86_64-w64-mingw32-gfortran, чтобы избежать проблем с совместимостью с этой программой.

Я уверен, что что-то не так в том, как я вызываю компилятор, но я не могу понять это из-за моего ограниченного опыта работы с Fortran. Я также пытаюсь найти похожие вопросы на этом веб-сайте, но я не мог найти ничего, что было бы тесно связано с моей проблемой.

+0

Я не знаю, что они должны быть в " obj ", не так ли? –

+0

Я просто протестировал более простую версию программы, которая не использует модуль «problem_definition_tools». Один и тот же командный файл компилируется без какой-либо ошибки, но он также не создает никаких объектных файлов в любом каталоге. Я не знаю, почему нет объектных файлов даже после правильной компиляции ... –

+0

После проверки снова и поиска на моем компьютере, я могу подтвердить, что нет никаких следов объектных файлов. Может быть, компилятор создает несколько временных файлов объектов, а затем удаляет их сразу после компиляции? –

ответ

0

Я думаю, это может быть связано с некоторым объявлением функции final_orbit.

кажется близко к следующей задаче:

Linking fortran module: "undefined reference"

И я думаю, что проблема должна быть расположена в коде модуля problem_definition_tools

+0

Относительность полностью очевидна. Вопрос в том, где истинный priblem, OP знает, какой модуль проблематичен. Связанный вопрос не связан, он говорит о неопределенной ссылке на внешнюю функцию, а не на функцию модуля. –

Смежные вопросы