Ignacio Martinez
2015-Jul-27 18:06 UTC
[Rd] R package with Fortran module on Windows? undefined reference to `__stack_chk_fail'
Hi, I created a R library that uses a Fortran module. Everything works like a charm on linux. Now I'm trying to make it work on Windows. I cloned my git repository <https://github.com/ignacio82/MyPi> on a windows computer, and when I press the build and reload button on Rstudio I get these errors: ==> Rcmd.exe INSTALL --no-multiarch --with-keep.source MyPi * installing to library 'C:/Users/IMartinez/Documents/R/R-3.2.1/library'* installing *source* package 'MyPi' ...** libs gfortran -m64 -shared -s -static-libgcc -o MyPi.dll tmp.def Fpi.o -Ld:/RCompile/r-compiling/local/local320/lib/x64 -Ld:/RCompile/r-compiling/local/local320/lib -LC:/Users/IMARTI~1/DOCUME~1/R/R-32~1.1/bin/x64 -lR Fpi.o: In function `__fortranpi_MOD_dboard': Fpi.f90:(.text+0xd7): undefined reference to `__stack_chk_fail' Fpi.o: In function `pi_': Fpi.f90:(.text+0x249): undefined reference to `__stack_chk_fail' collect2: ld returned 1 exit status no DLL was created ERROR: compilation failed for package 'MyPi'* removing 'C:/Users/IMartinez/Documents/R/R-3.2.1/library/MyPi' Exited with status 1. This is the Fortran code: Module Fortranpi IMPLICIT NONE contains subroutine dboard(darts, dartsscore) integer, intent(in) :: darts double precision, intent(out) :: dartsscore double precision :: x_coord, y_coord integer :: score, n score = 0 do n = 1, darts call random_number(x_coord) call random_number(y_coord) if ((x_coord**2 + y_coord**2) <= 1.0d0) then score = score + 1 end if end do dartsscore = 4.0d0*score/darts end subroutine dboard subroutine pi(avepi, DARTS, ROUNDS) bind(C, name="pi_") use, intrinsic :: iso_c_binding, only : c_double, c_int real(c_double), intent(out) :: avepi integer(c_int), intent(in) :: DARTS, ROUNDS integer :: MASTER, rank, i, n integer, allocatable :: seed(:) double precision :: pi_est, homepi, pirecv, pisum ! we set it to zero in the sequential run rank = 0! initialize the random number generator! we make sure the seed is different for each task call random_seed() call random_seed(size = n) allocate(seed(n)) seed = 12 + rank*11 call random_seed(put=seed(1:n)) deallocate(seed) avepi = 0 do i = 0, ROUNDS-1 call dboard(darts, pi_est) ! calculate the average value of pi over all iterations avepi = ((avepi*i) + pi_est)/(i + 1) end do end subroutine pi end module Fortranpi I tried adding <http://i.stack.imgur.com/lC82X.png> -fno-stack-protector -lssp but it did not help. I also tried doing this "by hand" <http://i.stack.imgur.com/WY4VD.png> and I get these errors:> system("R CMD SHLIB -fno-stack-protector -lssp ./src/Fpi.f90")gfortran -m64 -shared -s -static-libgcc -o src/Fpi.dll tmp.def ./src/Fpi.o -fno-stack-protector -lssp -Ld:/RCompile/r-compiling/local/local320/lib/x64 -Ld:/RCompile/r-compiling/local/local320/lib -LC:/Users/IMARTI~1/DOCUME~1/R/R-32~1.1/bin/x64 -lR> dyn.load("./src/Fpi.dll") Error in inDL(x, as.logical(local), as.logical(now), ...) : unable to load shared object 'C:/Users/IMartinez/Projects/MyPi/./src/Fpi.dll': LoadLibrary failure: %1 is not a valid Win32 application. 'C:/Users/IMartinez/Projects/MyPi/./src/Fpi.dll': LoadLibrary failure: %1 is not a valid Win32 application. Thanks for the help! ? PS: I posted this question in stackoverflow with no luck. <http://stackoverflow.com/questions/31638934/r-package-with-fortran-module-on-windows-undefined-reference-to-stack-chk-fa> PPS: I also sent this to r-help but they told me to try this list [[alternative HTML version deleted]]
Kevin Ushey
2015-Jul-27 19:12 UTC
[Rd] R package with Fortran module on Windows? undefined reference to `__stack_chk_fail'
You should be able to set PKG_FCFLAGS="-fno-stack-protector" when compiling to ensure that the stack protector is not used. (Trying that out on a Windows VM, with a simple `R CMD build` + `R CMD INSTALL`, compilation of your package succeeded but linking failed saying the DLL 'Fpi' was not found; I imagine that's a separate issue.) As an aside, be sure to check out what R-exts has to say on the topic of Fortran code in R packages (especially F90 and above): https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Using-F95-code. Cheers, Kevin On Mon, Jul 27, 2015 at 11:06 AM, Ignacio Martinez <ignacio82 at gmail.com> wrote:> Hi, > > I created a R library that uses a Fortran module. Everything works like a > charm on linux. > > Now I'm trying to make it work on Windows. I cloned my git repository > <https://github.com/ignacio82/MyPi> on a windows computer, and when I press > the build and reload button on Rstudio I get these errors: > > ==> Rcmd.exe INSTALL --no-multiarch --with-keep.source MyPi > * installing to library > 'C:/Users/IMartinez/Documents/R/R-3.2.1/library'* installing *source* > package 'MyPi' ...** libs > gfortran -m64 -shared -s -static-libgcc -o MyPi.dll tmp.def Fpi.o > -Ld:/RCompile/r-compiling/local/local320/lib/x64 > -Ld:/RCompile/r-compiling/local/local320/lib > -LC:/Users/IMARTI~1/DOCUME~1/R/R-32~1.1/bin/x64 -lR > Fpi.o: In function `__fortranpi_MOD_dboard': > Fpi.f90:(.text+0xd7): undefined reference to `__stack_chk_fail' > Fpi.o: In function `pi_': > Fpi.f90:(.text+0x249): undefined reference to `__stack_chk_fail' > collect2: ld returned 1 exit status > no DLL was created > ERROR: compilation failed for package 'MyPi'* removing > 'C:/Users/IMartinez/Documents/R/R-3.2.1/library/MyPi' > > Exited with status 1. > > > This is the Fortran code: > > > Module Fortranpi > IMPLICIT NONE > contains > subroutine dboard(darts, dartsscore) > integer, intent(in) :: darts > double precision, intent(out) :: dartsscore > double precision :: x_coord, y_coord > integer :: score, n > > score = 0 > do n = 1, darts > call random_number(x_coord) > call random_number(y_coord) > > if ((x_coord**2 + y_coord**2) <= 1.0d0) then > score = score + 1 > end if > end do > > dartsscore = 4.0d0*score/darts > > end subroutine dboard > > subroutine pi(avepi, DARTS, ROUNDS) bind(C, name="pi_") > use, intrinsic :: iso_c_binding, only : > c_double, c_int > real(c_double), intent(out) :: avepi > integer(c_int), intent(in) :: DARTS, ROUNDS > integer :: MASTER, rank, i, n > integer, allocatable :: seed(:) > double precision :: pi_est, homepi, pirecv, pisum > ! we set it to zero in the sequential run > rank = 0! initialize the random number generator! we make sure the > seed is different for each task > call random_seed() > call random_seed(size = n) > allocate(seed(n)) > seed = 12 + rank*11 > call random_seed(put=seed(1:n)) > deallocate(seed) > > avepi = 0 > do i = 0, ROUNDS-1 > call dboard(darts, pi_est) > ! calculate the average value of pi over all iterations > avepi = ((avepi*i) + pi_est)/(i + 1) > end do > end subroutine pi > > end module Fortranpi > > > I tried adding <http://i.stack.imgur.com/lC82X.png> -fno-stack-protector > -lssp but it did not help. > > I also tried doing this "by hand" <http://i.stack.imgur.com/WY4VD.png> and > I get these errors: > > >> system("R CMD SHLIB -fno-stack-protector -lssp ./src/Fpi.f90") > gfortran -m64 -shared -s -static-libgcc -o src/Fpi.dll tmp.def > ./src/Fpi.o -fno-stack-protector -lssp > -Ld:/RCompile/r-compiling/local/local320/lib/x64 > -Ld:/RCompile/r-compiling/local/local320/lib > -LC:/Users/IMARTI~1/DOCUME~1/R/R-32~1.1/bin/x64 -lR> > dyn.load("./src/Fpi.dll") > Error in inDL(x, as.logical(local), as.logical(now), ...) : > unable to load shared object 'C:/Users/IMartinez/Projects/MyPi/./src/Fpi.dll': > LoadLibrary failure: %1 is not a valid Win32 application. > 'C:/Users/IMartinez/Projects/MyPi/./src/Fpi.dll': > LoadLibrary failure: %1 is not a valid Win32 application. > > > Thanks for the help! > ? > > > PS: I posted this question in stackoverflow with no luck. > <http://stackoverflow.com/questions/31638934/r-package-with-fortran-module-on-windows-undefined-reference-to-stack-chk-fa> > > > PPS: I also sent this to r-help but they told me to try this list > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Ignacio Martinez
2015-Jul-27 19:37 UTC
[Rd] R package with Fortran module on Windows? undefined reference to `__stack_chk_fail'
Thanks, I just got the answer on stackoverflow!! <http://stackoverflow.com/questions/31638934/r-package-with-fortran-module-on-windows-undefined-reference-to-stack-chk-fa#31661475> On Mon, Jul 27, 2015 at 3:12 PM Kevin Ushey <kevinushey at gmail.com> wrote:> You should be able to set PKG_FCFLAGS="-fno-stack-protector" when > compiling to ensure that the stack protector is not used. > > (Trying that out on a Windows VM, with a simple `R CMD build` + `R CMD > INSTALL`, compilation of your package succeeded but linking failed > saying the DLL 'Fpi' was not found; I imagine that's a separate > issue.) > > As an aside, be sure to check out what R-exts has to say on the topic > of Fortran code in R packages (especially F90 and above): > https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Using-F95-code > . > > Cheers, > Kevin > > On Mon, Jul 27, 2015 at 11:06 AM, Ignacio Martinez <ignacio82 at gmail.com> > wrote: > > Hi, > > > > I created a R library that uses a Fortran module. Everything works like a > > charm on linux. > > > > Now I'm trying to make it work on Windows. I cloned my git repository > > <https://github.com/ignacio82/MyPi> on a windows computer, and when I > press > > the build and reload button on Rstudio I get these errors: > > > > ==> Rcmd.exe INSTALL --no-multiarch --with-keep.source MyPi > > * installing to library > > 'C:/Users/IMartinez/Documents/R/R-3.2.1/library'* installing *source* > > package 'MyPi' ...** libs > > gfortran -m64 -shared -s -static-libgcc -o MyPi.dll tmp.def Fpi.o > > -Ld:/RCompile/r-compiling/local/local320/lib/x64 > > -Ld:/RCompile/r-compiling/local/local320/lib > > -LC:/Users/IMARTI~1/DOCUME~1/R/R-32~1.1/bin/x64 -lR > > Fpi.o: In function `__fortranpi_MOD_dboard': > > Fpi.f90:(.text+0xd7): undefined reference to `__stack_chk_fail' > > Fpi.o: In function `pi_': > > Fpi.f90:(.text+0x249): undefined reference to `__stack_chk_fail' > > collect2: ld returned 1 exit status > > no DLL was created > > ERROR: compilation failed for package 'MyPi'* removing > > 'C:/Users/IMartinez/Documents/R/R-3.2.1/library/MyPi' > > > > Exited with status 1. > > > > > > This is the Fortran code: > > > > > > Module Fortranpi > > IMPLICIT NONE > > contains > > subroutine dboard(darts, dartsscore) > > integer, intent(in) :: darts > > double precision, intent(out) :: dartsscore > > double precision :: x_coord, y_coord > > integer :: score, n > > > > score = 0 > > do n = 1, darts > > call random_number(x_coord) > > call random_number(y_coord) > > > > if ((x_coord**2 + y_coord**2) <= 1.0d0) then > > score = score + 1 > > end if > > end do > > > > dartsscore = 4.0d0*score/darts > > > > end subroutine dboard > > > > subroutine pi(avepi, DARTS, ROUNDS) bind(C, name="pi_") > > use, intrinsic :: iso_c_binding, only : > > c_double, c_int > > real(c_double), intent(out) :: avepi > > integer(c_int), intent(in) :: DARTS, ROUNDS > > integer :: MASTER, rank, i, n > > integer, allocatable :: seed(:) > > double precision :: pi_est, homepi, pirecv, > pisum > > ! we set it to zero in the sequential run > > rank = 0! initialize the random number generator! we make sure the > > seed is different for each task > > call random_seed() > > call random_seed(size = n) > > allocate(seed(n)) > > seed = 12 + rank*11 > > call random_seed(put=seed(1:n)) > > deallocate(seed) > > > > avepi = 0 > > do i = 0, ROUNDS-1 > > call dboard(darts, pi_est) > > ! calculate the average value of pi over all iterations > > avepi = ((avepi*i) + pi_est)/(i + 1) > > end do > > end subroutine pi > > > > end module Fortranpi > > > > > > I tried adding <http://i.stack.imgur.com/lC82X.png> -fno-stack-protector > > -lssp but it did not help. > > > > I also tried doing this "by hand" <http://i.stack.imgur.com/WY4VD.png> > and > > I get these errors: > > > > > >> system("R CMD SHLIB -fno-stack-protector -lssp ./src/Fpi.f90") > > gfortran -m64 -shared -s -static-libgcc -o src/Fpi.dll tmp.def > > ./src/Fpi.o -fno-stack-protector -lssp > > -Ld:/RCompile/r-compiling/local/local320/lib/x64 > > -Ld:/RCompile/r-compiling/local/local320/lib > > -LC:/Users/IMARTI~1/DOCUME~1/R/R-32~1.1/bin/x64 -lR> > > dyn.load("./src/Fpi.dll") > > Error in inDL(x, as.logical(local), as.logical(now), ...) : > > unable to load shared object > 'C:/Users/IMartinez/Projects/MyPi/./src/Fpi.dll': > > LoadLibrary failure: %1 is not a valid Win32 application. > > 'C:/Users/IMartinez/Projects/MyPi/./src/Fpi.dll': > > LoadLibrary failure: %1 is not a valid Win32 application. > > > > > > Thanks for the help! > > ? > > > > > > PS: I posted this question in stackoverflow with no luck. > > < > http://stackoverflow.com/questions/31638934/r-package-with-fortran-module-on-windows-undefined-reference-to-stack-chk-fa > > > > > > > > PPS: I also sent this to r-help but they told me to try this list > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-devel at r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel >[[alternative HTML version deleted]]