RCPP未加载boost / asio.hpp

提问

我想包括Boost库中的一些功能.但是,当包含#include< boost / asio.hpp>时,该文件将无法编译,请参见我的示例:

// [[Rcpp::depends(BH)]]

#include <Rcpp.h>
#include <boost/asio.hpp>

// [[Rcpp::export]]
int main()
{
  return 0;
}

Error in dyn.load(“/tmp/RtmpRZlOEQ/sourceCpp-x86_64-pc-linux-gnu-0.12.14/sourcecpp_c4a63bcd586/sourceCpp_32.so”) :
unable to load shared object ‘/tmp/RtmpRZlOEQ/sourceCpp-x86_64-pc-linux-gnu-0.12.14/sourcecpp_c4a63bcd586/sourceCpp_32.so’:
/tmp/RtmpRZlOEQ/sourceCpp-x86_64-pc-linux-gnu-0.12.14/sourcecpp_c4a63bcd586/sourceCpp_32.so: undefined symbol: _ZN5boost6system15system_categoryEv

删除#include< boost / asio.hpp>时,一切正常.将asio.hpp替换为其他文件,例如integer.hpp都可以正常工作.

这是我的session.Info():

sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.3 LTS

Matrix products: default
BLAS: /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

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

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

loaded via a namespace (and not attached):
 [1] compiler_3.4.3  magrittr_1.5    rsconnect_0.8.5 tools_3.4.3     yaml_2.1.15     Rcpp_0.12.14    stringi_1.1.6   knitr_1.17     
 [9] stringr_1.2.0   BH_1.65.0-1    

我也在Windows 10上尝试过,也无法加载.

通过g编译时,一切正常:

// test.cpp
#include <boost/asio.hpp>

int main()
{
  return 0;
}

g test.cpp -lboost_system

最佳答案

是的,就是这样.让我解释一下,继续阅读,为您找到解决方案.

套餐BH

该软件包是仅标头的.没有链接.这样一来,您(作为软件包作者或用户)不必麻烦-lboost_system,而这很快会困扰整个系统.

等一下

对. BH仅是标头.因此不包括所有Boost,因为没有链接就无法全部拥有.例如.没有阿西欧

再说一次?没有阿西欧?

对.标准Boost版本导致需要Asio进行链接.这与我们的BH工作方式不兼容.

伤心

不要怕.在某个时候,我发现Asio作者还将其捆绑为第二种方式,即仅标头.因此,只需将我的CRAN软件包AsioHeadersBH一起使用即可.

评论