1

我有一个用 C 编写的第三方源文件和相应的头文件(包含 GSL 的声明和包含指令等)。我正在尝试围绕这些源文件构建一个 R 包,基本上是使用 Rcpp 为函数制作一个包装器。问题是这些文件包含不属于 C++ 标准的限制限定符,因此 R CMD INSTALL 无法编译包。它确实对 .c 文件使用 C 编译器,但是想要用 C++ 编译器编译 .h 文件,但它失败了。当它在头文件(包含在 .cpp 文件中)中找到限制时,它会失败。

我对 C 和编译器以及 Rcpp 等不太熟悉,所以我不确定这里最好的方法是什么?

最简单的事情可能是删除限制关键字。这就是我目前所做的(当我从头文件中删除限制但将它们留给 .c 文件时,我很惊讶 R CMD INSTALL 工作)。但我宁愿不更改 .c 和 .h 文件,因为它们也被其他人(可执行文件和 Python)用于非 R 环境,并且所有项目都有相同的文件会很好。

我还尝试定义空关键字restrict,以便如果编译是在C++ 编译器中完成的,它只会从函数定义中“删除”限制,但我无法完成这项工作。我在某处读到过类似的方法,但显然它不起作用。

如果我能以某种方式告诉编译器(通过 Makevars 或其他什么?)特定的 .h 文件应该用 C 编译器编译,它会起作用吗?或者 C++ 函数调用这些函数会有问题吗?

或者,如果这些函数是通过 C++ 包装器从 R 调用的,那么整个关键字在性能方面是否也很重要?

一件事就是放弃 Rcpp 并使用 .C 而不是来自 R 的 .Call,但由于性能是这里的关键,这并不是一个好的选择,因为我知道 .Call 更快(并且更可靠)。

请注意,最终这个包可能会找到通往 CRAN 的方法,因此该解决方案应该是相当可移植的。似乎有一些用于限制的 C++ 编译器特定关键字,但我想由于可移植性,这些不是一个选项。

4

1 回答 1

3

听起来您正在制作一个 .cpp 文件,#include <x.h>其中 xh 是使用restrict. 如果这是真的,我认为您可以修改 .cpp 文件来执行此操作:

#define restrict // nothing
extern "C"
{
#include <x.h>
}

然后编译您的 C++ 代码将看不到restrict关键字,而且我已经将标头包装在其中,extern "C"因为如果标头本身在内部没有这样做,您需要这样做,以便您的 C++ 编译器不会应用 C++“名称修改”到里面声明的函数。

于 2014-10-04T08:06:27.870 回答