我正在构建一个R包,其描述包含:
LinkingTo: Rcpp
该包具有相当深的makefile结构。我知道使用R CMD build .
创建和修改CXX11FLAGS
等变量,这些变量必须通过后续的makefile层向下传递。
我怀疑LinkingTo
也产生了这样一个变量,我必须注意并传递它。我怀疑这是因为,几层下来,我点击错误:
mycode.hpp:5:10: fatal error: Rcpp.h: No such file or directory
#include <Rcpp.h>
我不确定如何通知此文件的makefile以了解Rcpp的位置。我怀疑可以使用假设变量,但我不知道该变量的名称。任何人都可以澄清吗?
答案 0 :(得分:4)
以下是来自我的一个较小的正在进行的包中的LinkingTo:
:
LinkingTo: Rcpp, RcppArmadillo
编译时,这两个包都通过-I...
开关使用:
edd@bud:~/git/rcppkalman(master)$ ./cleanup
edd@bud:~/git/rcppkalman(master)$ R CMD INSTALL .
* installing to library ‘/usr/local/lib/R/site-library’
* installing *source* package ‘RcppKalman’ ...
** libs
ccache g++ -I/usr/share/R/include -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include" -fpic -g -O3 -Wall -pipe -Wno-unused -pedantic -Werror -march=native -c RcppExports.cpp -o RcppExports.o
ccache g++ -I/usr/share/R/include -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include" -fpic -g -O3 -Wall -pipe -Wno-unused -pedantic -Werror -march=native -c expmMat.cpp -o expmMat.o
ccache g++ -I/usr/share/R/include -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include" -fpic -g -O3 -Wall -pipe -Wno-unused -pedantic -Werror -march=native -c kfpredict.cpp -o kfpredict.o
ccache g++ -I/usr/share/R/include -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include" -fpic -g -O3 -Wall -pipe -Wno-unused -pedantic -Werror -march=native -c kfupdate.cpp -o kfupdate.o
ccache g++ -I/usr/share/R/include -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include" -fpic -g -O3 -Wall -pipe -Wno-unused -pedantic -Werror -march=native -c ltidisc.cpp -o ltidisc.o
ccache g++ -I/usr/share/R/include -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include" -fpic -g -O3 -Wall -pipe -Wno-unused -pedantic -Werror -march=native -c rtssmooth.cpp -o rtssmooth.o
ccache g++ -I/usr/share/R/include -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include" -fpic -g -O3 -Wall -pipe -Wno-unused -pedantic -Werror -march=native -c tfsmooth.cpp -o tfsmooth.o
g++ -Wl,-S -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o RcppKalman.so RcppExports.o expmMat.o kfpredict.o kfupdate.o ltidisc.o rtssmooth.o tfsmooth.o -llapack -lblas -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
installing to /usr/local/lib/R/site-library/RcppKalman/libs
** R
** demo
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (RcppKalman)
edd@bud:~/git/rcppkalman(master)$
没有其他需要。编写R扩展名称:
希望在其他包中使用头文件的包 需要在字段中将它们声明为以逗号分隔的列表 'DESCRIPTION'文件中的'LinkingTo'。例如
LinkingTo: link1, link2
'LinkingTo'字段可以具有检查的版本要求 在安装。
如果这些是C ++,在'LinkingTo'中指定包就足够了 包含源代码或静态链接的标题在 安装:包不需要(通常不应该 be)在'Depends'或'Imports'字段中列出。这包括CRAN 包 BH (https://CRAN.R-project.org/package=BH)几乎全部 用户 RcppArmadillo (https://CRAN.R-project.org/package=RcppArmadillo)和 RcppEigen (https://CRAN.R-project.org/package=RcppEigen)。
对于'LinkingTo'的另一种用法,请参阅* note链接到本机例程 在其他包::。
,从(基本上是空的)src/Makevars
:
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
这是RcppArmadillo用于支持LAPACK和BLAS的外部链接的标准用法。请注意,我的软件包稍稍落后,因为RcppArmadillo在其最新版本中现在使用inst/skeleton/Makevars
次传递到通过RcppArmadillo.package.skeleton()
创建的每个软件包中:
## optional
#CXX_STD = CXX11
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
还支持OpenMP(如果可用)。这是目前推荐的表格。
答案 1 :(得分:-1)
我编辑了Makefile
以包含以下黑暗魔法:
VARS_OLD := $(.VARIABLES)
$(foreach v, \
$(filter-out $(VARS_OLD) VARS_OLD,$(.VARIABLES)), \
$(info $(v) = $($(v))))
当您运行R CMD build .
时,这将打印出由R传递给make过程的所有环境变量。
挖掘这一点揭示了一些非常有趣的变量:
ALL_CPPFLAGS = -I/usr/share/R/include -DNDEBUG -I"/home/myuser/.R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include"
CLINK_CPPFLAGS = -I"/home/myuser/.R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include"
R_INCLUDE_DIR = /usr/share/R/include
请注意,这些变量包含-I
标志,因此必须传达给依赖于这些变量的构建过程的任何部分。
通过在makefile之间传递这些,我能够实现编译。