首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rcpp和mongodb c++驱动编译错误重新分配冲突?

rcpp和mongodb c++驱动编译错误重新分配冲突?
EN

Stack Overflow用户
提问于 2015-08-02 05:52:48
回答 1查看 228关注 0票数 0

我正在尝试用Rcpp编译包含mongodb cxx driver的代码。我已经能够独立编译C++代码,但是当我包含mongodb驱动程序的头文件并使用sourceCpp()函数时,我得到了错误。会话信息:

代码语言:javascript
复制
> sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 14.04.2 LTS

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8    
 [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
 [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Rcpp_0.12.0

loaded via a namespace (and not attached):
[1] tools_3.2.1

[file = hw.cpp]下面是C++代码

代码语言:javascript
复制
#include <R.h>
#include <Rcpp.h>
#include "mongo/client/dbclient.h" // for the driver
#include <cstdlib>
#include <iostream>
#include <vector>
#include <iomanip>

using namespace Rcpp;

// [[Rcpp::export]]
SEXP hw(){
    std::cout << "Hello Word" << std::endl;
    return Rcpp::wrap("Hello World!");
}

我使用sourceCpp()函数运行R中的代码:

代码语言:javascript
复制
library(Rcpp)
flgString <- '-pthread -lmongoclient -lboost_thread -lboost_system -lboost_regex'
Sys.setenv("PKG_CXXFLAGS"=flgString)
Sys.setenv("PKG_LIBS"=flgString)
sourceCpp("hw.cpp")

我得到了以下错误:

代码语言:javascript
复制
In file included from /usr/local/include/mongo/bson/oid.h:23:0,
                 from /usr/local/include/mongo/bson/bsonelement.h:26,
                 from /usr/local/include/mongo/bson/bsonobj.h:27,
                 from /usr/local/include/mongo/client/bulk_operation_builder.h:20,
                 from /usr/local/include/mongo/client/dbclientinterface.h:29,
                 from /usr/local/include/mongo/client/dbclient_rs.h:23,
                 from /usr/local/include/mongo/client/dbclient.h:59,
                 from hw.cpp:3:
/usr/local/include/mongo/bson/util/builder.h:58:41: error: macro "Realloc" requires 3 arguments, but only 2 given
         void* Realloc(void *p, size_t sz) { return realloc(p, sz); }
                                         ^
/usr/local/include/mongo/bson/util/builder.h:69:41: error: macro "Realloc" requires 3 arguments, but only 2 given
         void* Realloc(void *p, size_t sz) { 
                                         ^
/usr/local/include/mongo/bson/util/builder.h:263:47: error: macro "Realloc" requires 3 arguments, but only 2 given
             data = (char *) al.Realloc(data, a);
                                               ^
/usr/local/include/mongo/bson/util/builder.h:58:68: error: expected ‘;’ at end of member declaration
         void* Realloc(void *p, size_t sz) { return realloc(p, sz); }
                                                                    ^
In file included from /usr/share/R/include/R.h:50:0,
                 from hw.cpp:1:
/usr/share/R/include/R_ext/RS.h:64:37: error: expected identifier before ‘(’ token
 #define Free(p)        (R_chk_free( (void *)(p) ), (p) = NULL)
                                     ^
/usr/share/R/include/R_ext/RS.h:64:47: error: ‘parameter’ declared as function returning a function
 #define Free(p)        (R_chk_free( (void *)(p) ), (p) = NULL)
                                               ^
/usr/share/R/include/R_ext/RS.h:64:50: error: expected ‘)’ before ‘,’ token
 #define Free(p)        (R_chk_free( (void *)(p) ), (p) = NULL)
                                                  ^
In file included from /usr/local/include/mongo/bson/oid.h:23:0,
                 from /usr/local/include/mongo/bson/bsonelement.h:26,
                 from /usr/local/include/mongo/bson/bsonobj.h:27,
                 from /usr/local/include/mongo/client/bulk_operation_builder.h:20,
                 from /usr/local/include/mongo/client/dbclientinterface.h:29,
                 from /usr/local/include/mongo/client/dbclient_rs.h:23,
                 from /usr/local/include/mongo/client/dbclient.h:59,
                 from hw.cpp:3:
/usr/local/include/mongo/bson/util/builder.h:58:45: error: expected primary-expression before ‘return’
         void* Realloc(void *p, size_t sz) { return realloc(p, sz); }
                                             ^
/usr/local/include/mongo/bson/util/builder.h:58:45: error: expected ‘}’ before ‘return’
/usr/local/include/mongo/bson/util/builder.h:58:45: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘void*’ in initialization
/usr/local/include/mongo/bson/util/builder.h:58:45: error: expected ‘;’ before ‘return’
/usr/local/include/mongo/bson/util/builder.h:79:9: error: expected ‘;’ at end of member declaration
         }
         ^
In file included from /usr/share/R/include/R.h:50:0,
                 from hw.cpp:1:
/usr/share/R/include/R_ext/RS.h:64:37: error: expected identifier before ‘(’ token
 #define Free(p)        (R_chk_free( (void *)(p) ), (p) = NULL)
                                     ^
/usr/share/R/include/R_ext/RS.h:64:47: error: ‘parameter’ declared as function returning a function
 #define Free(p)        (R_chk_free( (void *)(p) ), (p) = NULL)
                                               ^
/usr/share/R/include/R_ext/RS.h:64:50: error: expected ‘)’ before ‘,’ token
 #define Free(p)        (R_chk_free( (void *)(p) ), (p) = NULL)
                                                  ^
In file included from /usr/local/include/mongo/bson/oid.h:23:0,
                 from /usr/local/include/mongo/bson/bsonelement.h:26,
                 from /usr/local/include/mongo/bson/bsonobj.h:27,
                 from /usr/local/include/mongo/client/bulk_operation_builder.h:20,
                 from /usr/local/include/mongo/client/dbclientinterface.h:29,
                 from /usr/local/include/mongo/client/dbclient_rs.h:23,
                 from /usr/local/include/mongo/client/dbclient.h:59,
                 from hw.cpp:3:
/usr/local/include/mongo/bson/util/builder.h:70:13: error: expected primary-expression before ‘if’
             if( p == buf ) {
             ^
/usr/local/include/mongo/bson/util/builder.h:70:13: error: expected ‘}’ before ‘if’
/usr/local/include/mongo/bson/util/builder.h:70:13: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘void*’ in initialization
/usr/local/include/mongo/bson/util/builder.h:70:13: error: expected ‘;’ before ‘if’
In file included from /usr/share/R/include/R.h:50:0,
                 from hw.cpp:1:
/usr/local/include/mongo/bson/util/builder.h: In member function ‘void mongo::_BufBuilder<Allocator>::kill()’:
/usr/share/R/include/R_ext/RS.h:64:24: error: expected unqualified-id before ‘(’ token
 #define Free(p)        (R_chk_free( (void *)(p) ), (p) = NULL)
                        ^
/usr/local/include/mongo/bson/util/builder.h: In member function ‘void mongo::_BufBuilder<Allocator>::reset(int)’:
/usr/share/R/include/R_ext/RS.h:64:24: error: expected unqualified-id before ‘(’ token
 #define Free(p)        (R_chk_free( (void *)(p) ), (p) = NULL)
                        ^
make: *** [hw.o] Error 1
g++ -I/usr/share/R/include -DNDEBUG    -I"/home/myName/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/myName/code/C++/mondodb"   -pthread -lmongoclient -lboost_thread -lboost_system -lboost_regex -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c hw.cpp -o hw.o
Error in sourceCpp("hw.cpp") : Error 1 occurred building shared library.

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-08-02 15:38:53

非常感谢Kevin,我已经按照您的建议使用ifdef/undef修改了标题,代码运行正常:

代码语言:javascript
复制
#include "mongo/client/dbclient.h" // for the driver
#ifdef Realloc
#undef Realloc
#endif
#include <R.h>
#include <Rcpp.h> 
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31766585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档