gpt4 book ai didi

c - R CMD SHLIB 从需要外部库的源 .c 文件创建 DLL(在 Windows x64 上)

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:21 25 4
gpt4 key购买 nike

首先,我对 C 编程和编译的整个概念还很陌生,所以我非常感谢有关这方面的一些非常直接和循序渐进的指导。

这是我的问题:我正在尝试编写一些可以动态加载到 R 中的 C 代码,以加快我的 R 任务。我的 C 代码将涉及一些非常复杂的矩阵运算,这些运算仅在具有头文件“matrix.h”和静态库文件“matrix.lib”的外部库中可用。它还会使用一些基本的 R 头文件,例如“Rdefines.h”等。文件“matrix.h”和“matrix.lib”位于 C:\lcc\includeC:\lcc\lib,分别。这是一个示例测试 C 代码:

#include <Rmath.h>
#include <R.h>
#include <Rdefines.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <matrix.h>

void foo(double *cdegree, double *fdegree, int *size) {

int i;
for(i=0; i<*size; i++) {
cdegree[i] = 5.0/9.0*(fdegree[i]-32.0);
}
}

如您所见,这是将华氏度转换为摄氏度的简单代码。尽管测试代码没有使用矩阵库中的任何内容,但这里的目标是能够同时包含 R 头文件和外部库中的 matrix.h。如果我尝试 R CMD SHLIB 这个 C 代码,我会收到“没有这样的文件或目录”错误,因为它试图包含“matrix.h”。我如何告诉 R 用外部库编译它?一切都在 Windows 8.1 X64 系统上完成。

最佳答案

老实说,如果您开始探索 Rcpp,您会发现它更容易。这是一个link向您介绍Rcpp。在整个文档中可以找到许多示例。

f2c.cpp

#include <Rcpp.h>

// [[Rcpp::export]]
void foo(Rcpp::NumericVector fdegree, Rcpp::NumericVector cdegree, int size){

int i;
for(i=0; i < size; i++){
cdegree[i] = 5.0/9.0*(fdegree[i]-32.0);
}
}

R代码

library(Rcpp)

sourceCpp("f2c.cpp")

fdegree <- c(98.6, 212, 32)
cdegree <- c(0,0,0)

foo(fdegree, cdegree, length(fdegree))
cdegree
[1] 37 100 0

当然,这会做出一些假设,但它演示了如何快速使用一些 C 代码,而不是摆弄所有 R header 和 SHLIB。

关于您对使用某些外部 header 的担忧,只需将 PKG_CXXFLAGS 环境变量设置为 header 的位置即可。

Sys.setenv("PKG_CXXFLAGS" = '-I"path/to/headers"')

接着是相同的编译。

sourceCpp("f2c.cpp")

但是,应该注意的是,如果您要执行这些功能中的几个以上,您应该使用 Rcpp 构建一个包并提供适当的 Makevars 文件。您可以找到有关 Rcpp 包开发的更多信息 here .

关于c - R CMD SHLIB 从需要外部库的源 .c 文件创建 DLL(在 Windows x64 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34516456/

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