From: Ken C. <Ken...@ki...> - 2003-01-20 15:20:44
|
In general, calling FORTRAN subroutines from a C main is a bad idea (and not supported on the FORTRANS that I've used). The FORTRAN runtime depends on things in the FORTRAN startup code having been run to work properly. The better way to do it is to make your C program a function, and make the FORTRAN the main. Then, just have the FORTRAN call the C code (which in turn calls FORTRAN subs). -----Original Message----- From: Luke Dunstan [mailto:cod...@ho...] Sent: Monday, January 20, 2003 4:25 AM To: min...@li...; Alberto Luaces Subject: Re: [Mingw-users] Mixing C and Fortran ----- Original Message ----- From: "Alberto Luaces" <al...@na...> To: <min...@li...> Sent: Monday, January 20, 2003 5:26 AM Subject: [Mingw-users] Mixing C and Fortran > Hello, I have a program written in C that calls some Fortran > functions. I successfully compile every file with 'gcc' for C files and 'g77' with Fortran ones. My problem is at linking stage. If I use 'gcc' to link, I get the following errors: > > (The program is a GUI application) > > H:\program>gcc *.o -o program -mwindows > ma27.o: In function `ma27nd_': > h:/program/ma27.f:1739: undefined reference to `s_wsfe' > h:/program/ma27.f:1739: undefined reference to `do_fio' > h:/program/ma27.f:1739: undefined reference to `e_wsfe' > h:/program/ma27.f:1742: undefined reference to `s_wsfe' > h:/program/ma27.f:1742: undefined reference to `do_fio' > h:/program/ma27.f:1742: undefined reference to `do_fio' > h:/program/ma27.f:1742: undefined reference to `do_fio' > h:/program/ma27.f:1742: undefined reference to `e_wsfe' > > So I tried with g77 because it seems that I had to link to the Fortran default libraries: > > H:\program>g77 *.o -o program -mwindows > G:/C/DEV-C/BIN/../lib/gcc-lib/mingw32/3.2/../../../libfrtbegin.a(frtbegi n.o. b)(. > text+0x3a): undefined reference to `MAIN__' > > This makes me think that g77-compiled programs must have their entry > point in a Fortran file, but mine is WinMain(). I'll have to use gcc again but specifying the libraries that g77 adds by default. > > How can I know what libraries I need? I searched in the specs file but > I couldn't find anything. You might try: g77 -v *.o -o program -mwindows This shows you the command line that the compiler uses to invoke the linker "ld". > > H:\>gcc -v > Reading specs from G:/C/DEV-C/BIN/../lib/gcc-lib/mingw32/3.2/specs > Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host= > mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --en able > -languages=f77,c++,objc,ada --disable-win32-registry --disable-shared > Thread model: win32 gcc version 3.2 (mingw special 20020817-1) > > Thanks. Luke ------------------------------------------------------- This SF.NET email is sponsored by: FREE SSL Guide from Thawte are you planning your Web Server Security? Click here to get a FREE Thawte SSL guide and find the answers to all your SSL security issues. http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0026en _______________________________________________ MinGW-users mailing list Min...@li... You may change your MinGW Account Options or unsubscribe at: https://lists.sourceforge.net/lists/listinfo/mingw-users |
From: FMGCFMGC <FMG...@te...> - 2003-01-21 23:12:22
|
Hello! Alberto escribi=F3=3A =3E h=3A/program/ma27=2Ef=3A1739=3A undefined reference to =60s=5Fwsfe=27= =3E h=3A/program/ma27=2Ef=3A1739=3A undefined reference to =60do=5Ffio=27= =3E h=3A/program/ma27=2Ef=3A1739=3A undefined reference to =60e=5Fwsfe=27= =3E h=3A/program/ma27=2Ef=3A1742=3A undefined reference to =60s=5Fwsfe=27= =3E h=3A/program/ma27=2Ef=3A1742=3A undefined reference to =60do=5Ffio=27= =3E h=3A/program/ma27=2Ef=3A1742=3A undefined reference to =60do=5Ffio=27= =3E h=3A/program/ma27=2Ef=3A1742=3A undefined reference to =60do=5Ffio=27= =3E h=3A/program/ma27=2Ef=3A1742=3A undefined reference to =60e=5Fwsfe=27= As Luke said this is resolved adding -lg2c at the end of your = compile/link command=2E As a recommendation=2C avoid using IO (WRITE/READ statements) on Fortran = units called from your C main=2E In the past i=27ve had problems with thi= s = (specially with DLLs made with Fortran objects)=2E Additionally=2C note t= he = grow on your executable size when linking statically with libg2c=2Ea=2E If you want to pass to C error messages add an integer error code = argument to your Fortran function/subroutine=2E See the SLATEC library = source code for a lot of good examples (or BLAS=2C LAPACK=2C =2E=2E=2E)=2E= http=3A//www=2Enetlib=2Eorg/slatec Ken Cornetet escribi=F3=3A =3E In general=2C calling FORTRAN subroutines from a C main is a bad idea= =3E (and not supported on the FORTRANS that I=27ve used)=2E The FORTRAN = =3E runtime depends on things in the FORTRAN startup code having been run= = =3E to work properly=2E The better way to do it is to make your C program= a = =3E function=2C and make the FORTRAN the main=2E Then=2C just have the FO= RTRAN =3E call the C code (which in turn calls FORTRAN subs)=2E It=27s possible to call a Fortran subroutine from a C main=2C specially = with gcc/g77=2C but possible too with other compilers=2E But mixing = C/Fortran IO calls is not recommended=2E Here you have some references=3A= http=3A//www=2Encsa=2Euiuc=2Eedu/UserInfo/Consulting/Tips/Mixed=5FLang=2E= html http=3A//techpubs=2Esgi=2Ecom/library/tpl/cgi-bin/getdoc=2Ecgi=3F coll=3D0650=26db=3Dbks=26srch=3D=26fname=3D/SGI=5FDeveloper/MPro7F90CD=5F= RM/20228 http=3A//metalab=2Eunc=2Eedu/pub/languages/fortran/ch1-11=2Ehtml CNF and F77 - Mixed Language Programming - Fortran and C (Programmer=27s = Manual) cfortran=2Eh=3A Interfacint C or C++ and FORTRAN http=3A//www-zeus=2Edesy=2Ede/=7Eburow/cfortran Hope it helps Francisco |