gfortran + cygwin: shared librairies?
FX Coudert
fxcoudert@gmail.com
Mon Jul 2 13:01:00 GMT 2007
[I'm forwarding this request that I received by private mail to the
fortran list]
Hello,
You always get more replies when you post to the list, instead of
mailing people privately, especially when you're not asking the right
guy :) Therefore, I copy the list so that the people who can give
you more help than I currently can.
Thanks for the report anyway!
FX
> Hello,
>
> I am currently ensuring the cygwin support of the software I am
> working on, but I have a trouble with gfortran. I attach all this
> as a small example:
> - open.f provides a routine which opens the file foo.txt and
> associates it to a logical unit. The library libopen.dll is created
> from the single file open.o.
> - read.f provides a routine which reads the first line of file
> foo.txt, by reading the logical unit opened by the above 'opening'
> routine. The library libread.dll is created from the single file
> read.o.
> - The main program test opens and reads the file. It is linked
> against these 2 dlls. And actually, it does not work and returns
> and EOF signal at the first read call.
> There is no problem if the open and read statements are called from
> the same dll.
>
> From our side, we suspect that it is a shared/static librairies
> trouble. The gfortran binaries distributed for cygwin only provide
> the static librairies:
>
> dhcp-bardeau READ/2-libs> gfortran -v
> Using built-in specs.
> Target: i686-pc-cygwin
> Configured with: ../gcc43/configure --prefix=/usr/local/gfortran --
> enable-languages=c,fortran --enable-bootstrap --enable-
> threads=posix --enable-sjlj-exceptions --enable-version-specific-
> runtime-libs --enable-nls --disable-libmudflap --disable-shared --
> disable-win32-registry --with-system-zlib --enable-checking=release
> --enable-werror --without-included-gettext --without-x --enable-
> libgomp
> Thread model: posix
> gcc version 4.3.0 20070512 (experimental)
>
> It seems that you are in charge to provide the cygwin binaries, and
> my request does not concern a bug, so that's why I email you. Is it
> possible that you activate the shared librairies creation (--enable-
> shared) ? I tried to recompile myself the gfortran executable and
> libraires, but I have other troubles in the gcc make processes...
>
> Thanks for your help,
>
> Sebastien Bardeau
>
>
> PROGRAM TEST
>
> INTEGER ERR, MY_OPEN
> !
> ERR = MY_OPEN("./foo.txt")
> IF (ERR.NE.0) THEN
> print *,"Test: error opening file", FILE
> RETURN
> ENDIF
> !
> CALL MY_READ
> !
> print *,"End of program"
> END PROGRAM TEST
> define logical VERIFY
> sic\let VERIFY = SIC%VERIFY
> sic veri &1
> !
> define double a[166]
> define double b[16,4]
> define double c[16,16,16]
> define double d[16,16]
> DEFINE CHARACTER GAG1*20
> DEFINE CHARACTER GAG2*20
> define logical log1
> define logical log2
> !
> sic\FOR prec 1 TO 3
> IF (prec.EQ.1) THEN
> SIC PRECISION DOUBLE
> ELSE IF (prec.EQ.2) THEN
> SIC PRECISION SINGLE
> ELSE IF (prec.EQ.3) THEN
> SIC PRECISION AUTO
> ENDIF
> sic\let A = 2*ASIN(1)
> sic\let B = ACOS(-1.0)
> sic\let GAG1 = "C'est tout bon"
> sic\let GAG2 = "C'est pas ca"
> IF (GAG1.EQ.GAG2) THEN
> ! BEEP 3
> PAUSE "Error in Math Formula Evaluation"
> ENDIF
> IF (A[9].NE.PI.OR.B[3,2].NE.PI) THEN
> ! BEEP 3
> PAUSE "Error in Math Formula Evaluation"
> ENDIF
> IF (ACOS(-1.0).NE.2*ASIN(1)) THEN
> ! BEEP 3
> PAUSE "Error in Math Formula Evaluation"
> ENDIF
> sic\let A = -1
> sic\let B = -1
> IF (10**-A[1]+B[6,3].NE.9) THEN
> PAUSE "Error in Math Formula Evaluation"
> ENDIF
> IF (GAG1.NE."C'est tout bon") THEN
> PAUSE "GAG has been modified"
> ENDIF
> IF (A[1].NE.-1) THEN
> PAUSE
> ENDIF
> IF (2*ASIN(MIN(MAX(A[1],2),ABS(B[3,3])))+EXP(1-0.).NE.PI+EXP(ABS
> (B[8,1])+2-1-1)) THEN
> SAY '(2*ASIN(MIN(MAX(A,2),ABS(B))))' 'PI'
> SAY '(2*ASIN(MIN(MAX(A,2),ABS(B))))-PI'
> PAUSE "Error in Math Formula Evaluation"
> ENDIF
> sic\let log1 = yes
> sic\let LOG1 = .FALSE.
> sic\let LOG2 = .TRUE.
> if (.NOT.(.not.(log1.and..not.log2))) then
> say (log1.and..not.log2)
> PAUSE "Error in Math Formula Evaluation"
> endif
> IF ((GAG1.EQ.GAG2.or.log1.eq.log2).and.pi.eq.(1+2-pi)) THEN
> ! BEEP 3
> PAUSE "Error in Math Formula Evaluation"
> ENDIF
> sic\let A[I] = SIN(I*PI|3)
> sic\let B[I,J] = MAX(I*PI,J)
> !
> ! Check newly implemented implicit transposition
> sic\let B[I,J] I
> sic\let A[5:8] B[3,]
> s\FOR I 5 TO 8
> IF (A[I].NE.3) THEN
> PAUSE "Error in implicit transposition"
> ENDIF
> NEXT
> ! Old bug. Now fixed...
> exa b[,2]
> !
> sic\let C[I,J,K] J
> sic\let B C[,8,13:16]
> s\FOR I 1 TO 16
> s\FOR J 1 to 4
> IF (B[I,J].NE.8) THEN
> PAUSE "Error in implicit transposition"
> ENDIF
> NEXT
> NEXT
> !
> s\let c = 0
> s\let c[8,,] = pi
> s\for j 1 to 16
> s\for k 1 to 16 by 5
> if (c[8,j,k].ne.pi) then
> say "s\let c[8,,] = pi"
> pause "Error in left side implicit transposition"
> endif
> next
> next
> next
> !
> s\LET C = 0
> s\LET C[I,J,K] = 1 /WHERE (I.EQ.J)
> sic veri off
> s\for i 1 to 16
> s\for j 1 to 16
> s\for k 1 to 16 by 5
> if (i.eq.j.and.c[i,j,k].ne.1) then
> pause "Error in LET/WHERE test"
> endif
> next
> next
> next
> sic\let SIC%VERIFY = VERIFY
> next
> sic\let SIC%VERIFY = VERIFY
> say " "
> say "Successful demo! Bye."
> say " "
> # FC = g95
> FC = gfortran
>
> # EXTRA_ARGS = /usr/local/lib/gcc-lib/i686-pc-cygwin/4.0.3/
> g95_dlltools/g95main.o
>
> default: test.exe
>
> %.o: %.f
> $(FC) -c $<
>
> libopen.dll: open.o
> $(FC) -shared -o $@ $<
>
> libread.dll: read.o
> $(FC) -shared -o $@ $<
>
> test.exe: libopen.dll libread.dll test.o
> $(FC) test.o $(EXTRA_ARGS) -o test.exe -L. -lopen -lread
>
> clean:
> rm -rf *~ *.o *.exe *.dll
> INTEGER FUNCTION MY_OPEN(FILE)
> !
> CHARACTER*(*) FILE
> CHARACTER*64 STATUS
> INTEGER UNIT, SIC_OPEN
> !
> UNIT = 53
> STATUS = 'OLD'
> !
> print *,"Opening file..."
> OPEN(UNIT=UNIT,FILE=FILE,STATUS=STATUS,FORM='FORMATTED'
> & ,ACTION='READ',IOSTAT=SIC_OPEN)
> print *,"...done. Return code was: ", SIC_OPEN
> !
> MY_OPEN = SIC_OPEN
> !
> END FUNCTION MY_OPEN
> SUBROUTINE MY_READ
>
> CHARACTER*64 LIGNE
> INTEGER UNIT
> !
> UNIT = 53
> !
> print *,"Reading file..."
> READ (UNIT,'(A)',END=150,ERR=202) LIGNE
> print *,"...done. LINE = ", LIGNE
> !
> RETURN
> !
> 202 WRITE(6,1000) 'Read error on macro file, unit ', UNIT
> 1000 FORMAT(A,I2)
> RETURN
> !
> 150 print *,"EOF: returning @ label 150"
> RETURN
> !
> END SUBROUTINE MY_READ
More information about the Fortran
mailing list