在Windows上使用Fortran模块的R包?未定义的引用`__stack_chk_fail'

时间:2015-07-26 15:51:03

标签: r fortran gfortran r-package

我创建了一个使用Fortran模块的R库。一切都像linux上的魅力一样。

现在我正试图让它在Windows上运行。我在Windows计算机上克隆了my git repository,当我按下Rstudio上的==> 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. 按钮时,我收到了以下错误:

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

我错过了什么?

-fno-stack-protector -lssp

根据this post的建议,我添加了> 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. ,但它没有帮助。也许我把它添加到了错误的地方?

Rstudio

我也试过手工做,我得到了这些错误:

Makevars.win

enter image description here

按照@cdeterman的说明,我做了以下事情:

  1. 我使用以下行在src中创建了==> 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 installing to C:/Users/IMartinez/Documents/R/R-3.2.1/library/MyPi/libs/x64 ** R ** preparing package for lazy loading ** help *** installing help indices ** building package indices ** testing if installed package can be loaded Error in library.dynam(lib, package, package.lib) : DLL 'MyPi' not found: maybe not installed for this architecture? Error: loading failed Execution halted ERROR: loading failed * removing 'C:/Users/IMartinez/Documents/R/R-3.2.1/library/MyPi' * restoring previous 'C:/Users/IMartinez/Documents/R/R-3.2.1/library/MyPi' Exited with status 1.

    PKG_FCFLAGS = “ - FNO堆叠保护器”

  2. 然后我也改变了NAMESPACE中的useDynLin(Fpi)来使用DynLib(MyPi)。

  3. 这就是我得到的:

    npm install 
    

1 个答案:

答案 0 :(得分:2)

使用以下行在Makevars.win目录中创建src文件。

PKG_FCFLAGS="-fno-stack-protector"

然后还将NAMESPACE中的useDynLib(Fpi)更改为useDynLib(MyPi),因为这是包名称。

尝试构建包。如果输出未显示正在使用的标志,则环境变量当前可能不存在并且无法正常工作。不确定为什么会这样。如果是这种情况,只需简单地初始化环境变量。

Sys.setenv(PKG_FCFLAGS = "")

这使您的软件包可以在我的Windows系统上构建。