Rcpp:安装带有静态库的包,以便独立于平台使用

2024-01-11

我想使用libDAI C++ https://bitbucket.org/jorism/libdaiR 包中的库并需要该包:

  1. 可在 Linux 和 Windows 上使用
  2. 节省磁盘空间(外部库有约 60 Mb)
  3. 最终用户不需要安装boost和gmp进行编译

我当前的设置是:

  • precompile libDAI
    • 将 libdai.a 复制到 lib/
    • 将所有 libDAI 头文件复制到 inst/include
  • 将 Makevar 添加到 src/

修改Makevar文件:

# include libraries
PKG_CPPFLAGS =-I../inst/include/
PKG_LIBS = -Llib -l../lib/libdai.a

我用于访问 libDAI 库的脚本是(src/ 中的 test.cpp):

#include <dai/factorgraph.h>
#include <Rcpp.h>
#include <cmath>

using namespace Rcpp;
using namespace std;
using namespace dai;

//'
//' Creates libDAI factor graph object
//'
//' @param factor_graph character definition of the factor graph
//' @export
// [[Rcpp::export]]
void initialize_factor_graph(const char* factor_graph) {

  // read the factor graph from the string
  std::istringstream fgStream(factor_graph);
  FactorGraph net;
  net.ReadFromString( fgStream );

  // Output some information about the factorgraph
  cout << "Factor graph has " << net.nrVars() << " variables" << endl;
  cout << "Factor graph has " << net.nrFactors() << " factors" << endl;

}

running Rscript -e "Rcpp::compileAttributes('libdai')", 其次是R CMD INSTALL libdai返回错误:

Error: package or namespace load failed for 'libdai' in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object 
'/home/jk/libs/R/libdai/libs/libdai.so':
  /home/jk/libs/R/libdai/libs/libdai.so: undefined symbol: _ZTVN3dai11FactorGraphE
Error: loading failed

所以我的问题是:

  • 我的设置有什么问题吗?
  • 在 CRAN 上分享我的最终包的最佳程序是什么?
  • 共享包的最佳设置是什么?

我的问题与密切相关this https://stackoverflow.com/questions/12781518/linking-static-library-into-r and this http://r.789695.n4.nabble.com/R-loadable-dll-with-minGW-compiled-linked-library-td3776733.html问题和其他几篇与引用静态库相关的帖子,但是我无法通过这些链接解决我的问题。


如何链接静态库

您可以使用-L<directory> -l<name> or <path>,即在你的情况下

PKG_LIBS = -L../lib -ldai

or

PKG_LIBS = ../lib/libdai.a

标头放置

标题为libDAI仅在内部使用。无法链接到这些标头中声明的函数。因此我不会使用inst/include对于这些标头。

对 CRAN 的依赖

gmp 库似乎可以在 CRAN 构建器上使用,c.f.https://github.com/cran/gmp https://github.com/cran/gmp and https://cran.r-project.org/package=gmp https://cran.r-project.org/package=gmp。看来libDAI需要linking提升(程序选项),参见。不过,看实际情况Makefile看来这仅用于测试和实用程序。所以你可能会逃脱提升headers由BH包提供。

预构建静态库

这是 Windows 上的常见方法(参见https://github.com/rwinlib https://github.com/rwinlib),但我发现这对于 Linux 来说很不寻常。更常见的方法是以下之一:

  • 将源代码包含在包中并在配置或包安装期间进行编译
  • 下载源代码并在配置期间编译
  • 与系统库的链接(不过我还没有看到 libDAI 的任何链接)。

对于这三种方法,CRAN 和 GitHub 上都有大量示例。不过,很难提出建议。我可能会选择“在包中包含源代码”并使用上游提供的 Makefile 作为构建库的起点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rcpp:安装带有静态库的包,以便独立于平台使用 的相关文章

随机推荐