我正在使用64位Ubuntu,我正在尝试编写C ++。
我发现如果我使用#include <Rcpp.h>
,我甚至不需要调用R命名空间中的任何函数,我就会收到未触发的引用错误:
obj/x.o: In function `Rcpp::Rstreambuf<true>::xsputn(char const*, long)':
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/iostream/Rstreambuf.h:61: undefined reference to `Rprintf'
obj/x.o: In function `Rcpp::Rstreambuf<false>::xsputn(char const*, long)':
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/iostream/Rstreambuf.h:65: undefined reference to `REprintf'
obj/x.o: In function `Rcpp::Rstreambuf<true>::overflow(int)':
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/iostream/Rstreambuf.h:70: undefined reference to `Rprintf'
obj/x.o: In function `Rcpp::Rstreambuf<false>::overflow(int)':
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/iostream/Rstreambuf.h:74: undefined reference to `REprintf'
obj/x.o: In function `Rcpp::Rstreambuf<true>::sync()':
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/iostream/Rstreambuf.h:79: undefined reference to `R_FlushConsole'
obj/x.o: In function `Rcpp::Rstreambuf<false>::sync()':
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/iostream/Rstreambuf.h:83: undefined reference to `R_FlushConsole'
我安装了r-base和r-base-dev。我通过以root身份运行R来安装Rcpp并执行了install.package("Rcpp")
我使用带有-I/usr/local/lib/R/site-library/Rcpp/include
我在这里缺少什么?感谢您的回复。
答案 0 :(得分:2)
仅提取Rcpp
标头是不够的。您还需要R标头并链接到R的库。你可以用例如R CMD SHLIB
为你做这件事。
但是,我建议你:
LinkingTo: Rcpp
等的包...(请参阅Rcpp的文档)。 sourceCpp
文件中使用.cpp
。请参阅?sourceCpp
答案 1 :(得分:0)
正如罗曼·弗朗索瓦所指出的那样,你不仅可以拥有标题(声明),还需要实施。
我建议制作一个生成.so对象的Makefile。 R CMD SHLIB命令是一个很好的起点,可以确定需要哪些标志,但它不能处理设计在Matlab外部执行的函数。
然后,您需要在g ++调用中找到Rcpp.so和libR.so并链接它们。
因此,有希望在R&#34;之外使用R&#34; - 就我而言,我能够将VineCopula包中的一些东西编译成Matlab能够读取的.so文件。
请参阅下面的Makefile(仅作为示例):
CFLAGS=-I/usr/share/R/include/ -I/usr/local/lib/R/site-library/Rcpp/include/ -I/usr/local/lib/R/site-library/VineCopula/include -dynamiclib -Wl,-headerpad_max_install_names -shared -L/usr/lib/R/lib -lR
CFLAGS2=-I/usr/share/R/include/ -I/usr/local/lib/R/site-library/Rcpp/include/ -I/usr/local/lib/R/site-library/VineCopula/include
LDFLAGS=-DNDEBUG -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g
all: RVinePDF.so
RVinePDF.so: RVinePDF.o Rcpp.so libR.so
g++ $(CFLAGS) -o RVinePDF.so RVinePDF.o Rcpp.so libR.so $(LDFLAGS)
\rm *.o
RVinePDF.o: RVinePDF.cpp
g++ $(CFLAGS2) -o RVinePDF.o -c RVinePDF.cpp $(LDFLAGS)
[other .o files defined similarly]