繁体   English   中英

包含Rcpp.h时出现未定义的参考错误

[英]Undefined reference errors when including Rcpp.h

我正在使用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 g ++编译C ++程序

我在这里想念什么? 感谢您的任何答复。

仅提取Rcpp标头是不够的。 您还需要R标头并针对R的库进行链接。 您可以使用R CMD SHLIB来帮助您。

但是,我建议您:

  • 创建一个具有LinkingTo: Rcpp等...的程序包(请参阅Rcpp的文档)。
  • .cpp文件上使用sourceCpp 参见?sourceCpp

正如Romain Francois指出的那样,您不仅可以拥有标题(声明),还需要实现。

我建议是制作一个生成.so对象的Makefile。 R CMD SHLIB命令是确定需要哪些标志的很好的起点,但是它不能处理设计为在Matlab外部执行的功能。

然后,您需要找到Rcpp.so和libR.so并在您的g ++调用中将它们链接在一起。

因此,有希望“在R之外使用R”-在我的情况下,我能够将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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM