【发布时间】:2014-11-29 04:25:01
【问题描述】:
我有一个第三方源文件和相应的头文件(包含 GSL 的声明和包含指令等),它们是用 C 编写的。我正在尝试围绕这些源文件构建一个 R 包,基本上是为函数制作一个包装器使用 Rcpp。问题是这些文件包含不属于 C++ 标准的限制限定符,因此 R CMD INSTALL 无法编译包。它确实对 .c 文件使用 C 编译器,但是 想用 C++ 编译器编译 .h 文件,但它失败了。 当它在头文件(包含在 .cpp 文件中)找到限制时失败。
我不太熟悉 C 和编译器以及 Rcpp 等,所以我不确定这里最好的方法是什么?
最简单的事情可能是删除限制关键字。这就是我目前所做的(当我从头文件中删除限制但将它们留给 .c 文件时,我很惊讶 R CMD INSTALL 工作)。但我宁愿不更改 .c 和 .h 文件,因为它们也被其他人用于非 R 环境(可执行文件和 Python 中),并且所有项目都有相同的文件会很好。
我还尝试定义空关键字restrict,以便如果编译是在C++ 编译器中完成的,它只会从函数定义中“删除”restrict,但我无法完成这项工作。我在某处读到过类似的方法,但显然它不起作用。
如果我能以某种方式告诉编译器(通过 Makevars 或其他方式?)特定的 .h 文件应该用 C 编译器编译,它会起作用吗?还是 C++ 函数调用这些函数会有问题?
或者,如果这些函数是通过 C++ 包装器从 R 调用的,那么整个关键字是否会影响性能?
一件事就是放弃 Rcpp 并使用 .C 而不是来自 R 的 .Call,但由于性能是这里的关键,这并不是一个好的选择,因为我知道 .Call 更快(更可靠)。
请注意,这个包最终会找到通往 CRAN 的途径,因此该解决方案应该是相当可移植的。似乎有一些 C++ 编译器特定的关键字用于限制,但我想这些不是一个选项,因为可移植性。
【问题讨论】:
-
当您说将
restrict定义为空不起作用时,究竟发生了什么?另外,我很困惑:为什么 Rcpp 试图编译你的头文件?它不只需要编译你的 .c 文件吗? -
哦,是的,我写错了(我真的是这些东西的新手......),Rcpp 没有编译头文件,但无论如何都会用它做一些事情(因为我将它包含在 .cpp 文件中,所以我可以调用这些函数)。我收到的错误消息是“在 xR.cpp:3:0:xh:77:34 中包含的文件中:错误:在 'input' 之前需要 ',' 或 '...'”(我有变量 double const* 限制输入在函数声明中)。
标签: c++ c r rcpp restrict-qualifier