包含Rcpp.h时未定义的引用错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了包含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")

我使用g ++与-I/usr/local/lib/R/site-library/Rcpp/include编译C ++程序

我在这里错过了什么?谢谢你的回复。

答案

只是拉Rcpp标题是不够的。您还需要R标头并链接到R的库。你可以用例如R CMD SHLIB为你做这件事。

但是,我建议你:

  • 创建一个包含LinkingTo: Rcpp等的包...(参见Rcpp的文档)。
  • sourceCpp文件中使用.cpp。见?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) 
  
m *.o 

RVinePDF.o: RVinePDF.cpp 
  g++ $(CFLAGS2) -o RVinePDF.o -c RVinePDF.cpp $(LDFLAGS)

[other .o files defined similarly]

以上是关于包含Rcpp.h时未定义的引用错误的主要内容,如果未能解决你的问题,请参考以下文章

重载 cout 时未定义的引用

在 c++ 对象上使用 extern 时未定义的引用,但不是整数类型

调用内联函数时未定义的引用

使用本地头文件时未定义的引用

奇怪的错误 - 链接到自己的库gcc时未定义的引用

链接时未定义的参考错误 - Makefile 并包含已配置