使用cpp11开发R包时devtools加载函数提示‘对象未找到’问题
使用cpp11开发R包时函数找不到的排查与解决方法
1. 确认源码目录与导出标记
- 必须将C++源码文件放在包的
src/目录下,devtools仅编译该目录下的代码,其他位置的源码无法生成可调用的动态链接库 - C++函数必须添加
[[cpp11::export]]标记才能被导出,示例代码:#include "cpp11.hpp" using namespace cpp11; [[cpp11::export]] integers Xt(integers X) { return X; }
2. 避免手动编写R包装函数
- 删除你手动定义的R包装函数,cpp11会在编译时自动生成
R/cpp11.R文件,其中包含正确调用内部C++函数的包装代码 - 检查
cpp11dummypackage-package.R,不要在其中定义或覆盖Xt函数,避免干扰自动生成的逻辑
3. 清理旧产物并重新编译
- 先清理旧的编译文件:
devtools::clean() - 强制重新编译并加载包:
devtools::load_all(compile = TRUE) - 注意查看加载过程中的输出,如果有编译错误或警告,会直接导致函数无法正确导出
4. 检查包配置文件
- 确认
DESCRIPTION文件包含以下内容:LinkingTo: cpp11 Imports: cpp11 SystemRequirements: C++11 - 确认
NAMESPACE文件有自动生成的配置:
不要手动修改这部分内容,cpp11会自动维护配置import(cpp11) useDynLib(cpp11dummypackage, .registration = TRUE)
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

