我编写了一个带有一些Fortran子程序的R包。
使用英特尔IFORT进行优化编译Fortran子程序可以大大减少运行时间。我现在想要分发R-package,而不是作为源代码包,而是作为带有Intel IFORT二进制文件的内置包。
我可以使用基于IFORT的共享库轻松构建R包,但它需要英特尔库。我应该在包中包含这些库吗?这对我来说似乎不对,我该如何确定要包含哪些文件?
另一种方法是将我的软件包编译为静态链接库,因此不依赖于与英特尔库一起分发(必要的部分将内置到我的库中,是吗?)。只是,这如何改变我的R包?我还在使用dyn.load
吗?如何将其编译为静态?
正常的构建过程是:
gfortran -fpic -g -O2 -c frotran.f95 -o frotran.o
gfortran -shared -L/exports/applications/apps/SL7/R/3.3.2/lib64/R/lib -L/usr/local/lib64 -o MyPackage.so frotran.o -L/exports/applications/apps/SL7/R/3.3.2/lib64/R/lib -lR
我发现用gfortran
替换ifort
就足够了动态链接库。静态构建它通常由-c
参数完成。我最后一次失败的结果是:
ifort -O3 -fpic -c frotran.f95 -o frotran.o
ifort -O3 -c -L/exports/applications/apps/SL7/R/3.3.2/lib64/R/lib -L/usr/local/lib64 -o MyPackage.so frotran.o -L/exports/applications/apps/SL7/R/3.3.2/lib64/R/lib -lR
带输出:
ifort: warning #10145: no action performed for file 'frotran.o'
总结: