如何在R包开发中用相对路径执行R CMD SHLIB命令?
解决R包中用相对路径调用
R CMD SHLIB编译C++代码的问题 你的写法错误在于混淆了R CMD SHLIB的-I参数用途,-I是用来指定头文件搜索目录的,不是用来指定要编译的cpp文件路径的。下面是正确的实现方式:
基础正确写法
如果你的code.cpp文件位于FolderA/FolderB目录下,直接用here生成完整文件路径即可,不需要额外的-I参数(除非你有单独的头文件目录需要指定):
# 设置编译选项(保留原有的OpenMP配置) Sys.setenv("PKG_CPPFLAGS" = "-fopenmp -DPARALLEL") # 删除旧的编译产物(用here指定路径,替代原来的system("rm")) file.remove(here::here("code.so"), here::here("code.o"), here::here("code.dll")) # 生成cpp文件的完整路径 cpp_file_path <- here::here("FolderA", "FolderB", "code.cpp") # 构建并执行编译命令 system(paste("R CMD SHLIB", cpp_file_path))
需要指定头文件目录的情况
如果你的C++代码依赖的头文件在单独的目录(比如include文件夹),才需要使用-I参数指定头文件路径,此时命令写法如下:
include_dir <- here::here("include") # 头文件所在目录 cpp_file_path <- here::here("FolderA", "FolderB", "code.cpp") system(paste("R CMD SHLIB -I", include_dir, cpp_file_path))
错误原因说明
你之前的代码把cpp文件路径直接跟在-I后面,导致R CMD SHLIB会把这个路径识别为头文件搜索目录,而找不到需要编译的cpp文件,自然执行失败。
内容的提问来源于stack exchange,提问作者Lucas Freitas
相关产品推荐
相关产品推荐

