Я пишу программу в 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 \
- \ включают
- \ worhp \
- macros.h
- \ worhp \
- \ Lib
- libworhp.lib
- \ OBJ
- worhp_interface.mod
- \ ЦСИ
- MAIN.f90
- компиляции.bat
Я хотел бы указать, что модуль «problem_definition_tools» написан мной, и я точно знаю, что он работает, потому что я уже использовал его в другой программе. Кроме того, я перекомпилировал его с помощью x86_64-w64-mingw32-gfortran, чтобы избежать проблем с совместимостью с этой программой.
Я уверен, что что-то не так в том, как я вызываю компилятор, но я не могу понять это из-за моего ограниченного опыта работы с Fortran. Я также пытаюсь найти похожие вопросы на этом веб-сайте, но я не мог найти ничего, что было бы тесно связано с моей проблемой.
Я не знаю, что они должны быть в " obj ", не так ли? –
Я просто протестировал более простую версию программы, которая не использует модуль «problem_definition_tools». Один и тот же командный файл компилируется без какой-либо ошибки, но он также не создает никаких объектных файлов в любом каталоге. Я не знаю, почему нет объектных файлов даже после правильной компиляции ... –
После проверки снова и поиска на моем компьютере, я могу подтвердить, что нет никаких следов объектных файлов. Может быть, компилятор создает несколько временных файлов объектов, а затем удаляет их сразу после компиляции? –