gpt4 book ai didi

c++ - 如何使用 Makevars 链接到 RCPP 中已编译的外部共享库?

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:41 26 4
gpt4 key购买 nike

我已经查看了多个地方,但没有找到一个简单的例子来解决我的问题。

我需要的是能够使用我拥有的多个 .so 文件(连同 .h 文件)。

一个简单的例子是:

我有以下文件:a.h、a.cpp 函数 jeden - 这是我的 R 库 accessor.cpp,它将外部库 libdwa.so 中的函数 dwa 暴露给 R。我有头文件 dwa.h 和这个库 libdwa.so。

只有当我将库文件 libdwa.so 放入目录“/usr/lib”(我使用 Debian)时,我才能管理构建二进制包(并且一切正常)。但它不是可分割的解决方案。

我应该在哪里放置库“dwa”文件(dwa.h 和 libdwa.so)以及在 Makevars 文件中添加哪些标志以获得可移植的解决方案?

已添加摘要

我在这里总结了我的结果。我相信一些极其简单的示例在开始时很有用。

  1. 2 个外部库放在 inst 中:

    /inst/include/dwa.h
    /inst/include/trzy.h
    /inst/jeden/libdwa.so
    /inst/jeden/libtrzy.so
  2. configure 文件 /configure 具有以下形式(test6 是包的名称):

    #!/bin/bash
    rpath=$(${R_HOME}/bin/Rscript -e 'cat(file.path(.libPaths()[1], "test6", "jeden"))') #'
    sed -e"s|@rpath@|"${rpath}"|" src/Makevars.in > src/Makevars

    exit 0
  3. 文件 /src/Makevars.in 的格式为:

    CXX_STD = CXX11

    PKG_CPPFLAGS = -I../inst/include/ -I.
    PKG_LIBS = -ldwa -ltrzy -L../inst/jeden -Wl,-rpath,@rpath@
  4. /src/accessor.cpp 将库函数暴露给 R:

    #include <Rcpp.h>
    #include "../inst/include/dwa.h"
    #include "../inst/include/trzy.h"

    // [[Rcpp::export]]
    Rcpp::String r_dwa() {
    Rcpp::String res = dwa();.
    return res;
    }

    // [[Rcpp::export]]
    Rcpp::String r_trzy() {
    Rcpp::String res = trzy();.
    return res;
    }
  5. 纯 R 库 _/src/hello_world.cpp_ 也存在:

    #include <Rcpp.h>
    using namespace Rcpp;

    // [[Rcpp::export]]
    String hello_world() {
    String hw = "Hello World";
    return hw ;
    }
  6. 最后 /NAMESPACE 文件:

    useDynLib("test6", .registration=TRUE)

    import("Rcpp")
    importFrom("utils", "object.size", "packageVersion")
    exportPattern("^[[:alpha:]]+")

构建 sourcebinary 包是成功的,但只有 source 一个有用,因为 binary 有路径图书馆写得死板。

最佳答案

假设您的目录结构如下

/opt/dwa/include/dwa.h
/opt/dwa/lib/libdwa.so

在那种情况下你可以使用 src/Makevars:

PKG_CPPFLAGS = -I/opt/dwa/include
PKG_LIBS = -L/opt/dwa/lib -ldwa -Wl,-rpath,/opt/dwa/lib

当然,这仍然不可移植,因为库和头文件的路径是硬编码的。为了避免这种情况,可以使用模板文件,例如src/Makevars.in

PKG_CPPFLAGS = @DWA_INC@
PKG_LIBS = @DWA_LIB@

并编写一个 configure 脚本来检查环境并根据调查结果创建 src/Makevars。编写configure 脚本有不同的策略。我通常使用 autoconf,例如在 RcppArrayFiredqmagic .

关于c++ - 如何使用 Makevars 链接到 RCPP 中已编译的外部共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56881806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com