[완료]포트란 컴파일 에러좀 도와주세요..
어제도 질문을 드렸는데 해결하고 나도 에러가 연속이군요..
ioapi-3.0 컴파일을 하고 있는데 아래와 같이 에러가 발생합니다.
*****************************************************************
make[1]: Entering directory `/home/wonhae/Modeling/ioapi-3.0/m3tools'
cd /home/wonhae/Modeling/ioapi-3.0/Linux2_x86_64gfort; gfortran /home/wonhae/Modeling/ioapi-3.0/Linux2_x86_64gfort/datshift.o -L/home/wonhae/Modeling/ioapi-3.0/Linux2_x86_64gfort -L/usr/share/pvm3/lib/LINUX64 -lioapi -lnetcdf -lpvm3 -fopenmp -o datshift
/home/wonhae/Modeling/ioapi-3.0/Linux2_x86_64gfort/datshift.o: In function `MAIN__':
datshift.f:(.text+0xe): undefined reference to `iargc_'
collect2: ld returned 1 exit status
make[1]: *** [datshift] Error 1
make[1]: Leaving directory `/home/wonhae/Modeling/ioapi-3.0/m3tools'
make: *** [all] Error 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
datshift.f 코드는 아래구요..
코드에 보면 IARGC 라는게 선언되어 있는데 이걸 의미하는거같기도 한데요..
제가 그냥 외부라이브러리나 다른 선언없이 그냥 IARGC() 사용해서 코딩을 해봐도 에러가 안납니다.
그리고
~~~~~~~~~~~~~~~~~~~~~
nm datshift.o | grep -i iargc
해보니
U iargc_ 라고 뜹니다.
~~~~~~~~~~~~~~~~~~~~~~~~
'undefine reference to 'iargc_' 이거 어떻게 해야될까요..
make 한줄 해결하는데 하루넘게 걸리네요..아직 여러줄 남았는데..에휴..
~~~~~~~~~~~~~~~~datshift.f~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IMPLICIT NONE
C........... EXTERNAL FUNCTIONS and their descriptions:
INTEGER IARGC
INTEGER GETDATE
INTEGER GETNUM
INTEGER JULIAN
INTEGER STR2INT
EXTERNAL IARGC, GETDATE, GETNUM, JULIAN, STR2INT
C........... PARAMETERS and their descriptions:
CHARACTER*80 PROGVER
DATA PROGVER /
&'$Id:: datshift.f 49 2007-07-06 16:20:50Z coats@borel $'
& /
C........... LOCAL VARIABLES and their descriptions:
INTEGER ARGCNT ! number of command-line args, from IARGC()
INTEGER DAY
INTEGER EGDATE ! output gregorian date
INTEGER MON
INTEGER JDATE ! internal julian date
INTEGER JTIME ! internal julian time
INTEGER SGDATE ! input gregorian date
INTEGER TSTEP ! time step for changing dates
INTEGER YR
CHARACTER*80 DATBUF
CHARACTER*80 STEPBUF
C***********************************************************************
C begin body of program DATSHIFT
ARGCNT = IARGC()
IF ( ARGCNT .EQ. 2 ) THEN
CALL GETARG( 1, DATBUF )
CALL UPCASE( DATBUF )
SGDATE = STR2INT( DATBUF )
CALL GETARG( 2, STEPBUF )
TSTEP = STR2INT( STEPBUF )
READ( DATBUF, * ) SGDATE
END IF
IF ( ARGCNT .NE. 2 .OR.
& SGDATE .GT. 99999999 .OR.
& SGDATE .LT. 1 ) THEN
WRITE( *,92000 ) ' ', ' ',
& 'Program DATSHIFT takes calendar date (in form YYYYMMDD)',
& 'and a number of days as an increment and returns the date',
& 'in Gregorian-date form "YYYYMMDD".',
& ' ',
& ' Usage: "datshift [ <+/- days>]" ', ' ',
& '(if the command-line arguments are missing, prompts the ',
& 'user for them)',
& ' ',
&'See URL http://www.baronams.com/products/ioapi/AA.html#tools',
&' ',
&'Program copyright (C) 1992-2002 MCNC and Carlie J. Coats, Jr.',
&'and (C) 2002-2007 Baron Advanced Meteorological Systems, LLC',
&'Released under Version 2 of the GNU General Public License.',
&'See enclosed GPL.txt, or URL',
&'http://www.gnu.org/copyleft/gpl.html',
&' ',
&'Comments and questions are welcome and can be sent to',
&' ',
&' Carlie J. Coats, Jr. coats@baronams.com',
&' Baron Advanced Meteorological Systems, LLC.',
&' 920 Main Campus Drive, Suite 101',
&' Raleigh, NC 27606',
&' ',
&'Program version: ',
&PROGVER,
&'Program release tag: $Name$',
&' '
SGDATE = GETDATE( 19950701,
& 'Enter date (YYYYMMDD) or (YYYYDDD)' )
TSTEP = GETNUM( -9000, 9000, 1,
& 'Enter days increment' )
WRITE( DATBUF, 92010 ) SGDATE
END IF ! if argcnt=2, or not
C......... Convert date formats
IF( SGDATE .GT. 9999366 ) THEN
YR = STR2INT( DATBUF( 1:4 ) )
MON = STR2INT( DATBUF( 5:6 ) )
DAY = STR2INT( DATBUF( 7:8 ) )
JDATE = 1000 * YR + JULIAN( YR, MON, DAY )
JTIME = 120000
ELSE
JDATE = SGDATE
JTIME = 120000
ENDIF
TSTEP = TSTEP * 240000
CALL NEXTIME( JDATE, JTIME, TSTEP )
YR = JDATE / 1000
CALL DAYMON( JDATE, MON, DAY )
EGDATE = YR * 10000 + MON*100 + DAY
WRITE( *,92010 ) EGDATE
CALL EXIT( EGDATE )
C****************** FORMAT STATEMENTS ******************************
C........... Informational (LOG) message formats... 92xxx
92000 FORMAT( 5X, A )
92010 FORMAT( I8.8 )
END
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
아래 라인을 카먼트로 처리한 후 한번 컴파일해
아래 라인을 카먼트로 처리한 후 한번 컴파일해 보세요.
제 생각에는 IARGC 이 intrinsic function 이라서 EXTERNAL 로 할 필요는 없을거 같군요.
EXTERNAL IARGC, GETDATE, GETNUM, JULIAN, STR2INT
아래 링크 참조하세요.
http://gcc.gnu.org/onlinedocs/gfortran/IARGC.html
너무 고맙습니다.
님 말씀대로 커멘트 처리를 하니 그 부분 통과하네요..
그 파일 말고 다른 몇몇 파일이 다 external 로 선언이 되어 있는데
다 해결되었습니다.
저거 말고도 C 코드도 범위가 안맞는 변수선언으로 에러가 몇개 있더라구요..
저 ioapi는 여러 운영체제랑 컴파일별로 코딩을 다 해놨던데..
작성하시는 분이 여러 개로 하다보니 헷갈렸는 모르겠네요..
암튼 너무 고맙습니다. 복받으시구요..
부산에 계시는 분이면 막걸리라도 한잔 사드리고 싶네요. ^^
댓글 달기