如何编译文件名含空格的C文件以在R中生成动态库?
解决R编译含空格的C文件生成动态库问题
当C文件名包含空格时,直接用system2('R', c('CMD', 'SHLIB', 'Essai 1.c'))会报错,核心原因是system2会将带空格的文件名拆分为两个独立参数传递给R CMD SHLIB,导致命令误把Essai和1.c当作两个不同文件处理。
正确处理方案
使用shQuote()函数包裹带空格的文件名,确保它被识别为单个完整参数:
N.Nodes <- 145 # 用shQuote处理带空格的C文件名,避免参数拆分 system2('R', c('CMD', 'SHLIB', shQuote('Essai 1.c'))) # 加载动态库时同样处理带空格的文件名 dyn.load(shQuote("Essai 1.dll")) add <- function(x, y){ return(.Call("add", as.double(x), as.double(y))) } N.Nodes add(1, pi) N.Nodes dyn.unload(shQuote("Essai 1.dll"))
原理说明
shQuote()会根据当前操作系统自动添加适配的引号(Windows用双引号,类Unix系统用单引号),强制命令行将带空格的文件名解析为单个完整路径,彻底避免参数拆分错误。
验证步骤
- 确保
Essai 1.c文件与R脚本在同一目录下 - 运行修正后的脚本,编译过程无报错,且能正常调用C函数、修改全局变量
N.Nodes
内容的提问来源于stack exchange,提问作者Olivier7121
相关产品推荐
相关产品推荐

