编译对接R的C文件时遇ld过时警告,是否需关注?
MacOS下R CMD SHLIB编译时ld过时警告的说明
两个警告的具体含义
ld: warning: -single_module is obsolete
这是旧版MacOS链接器的参数,原本用来强制生成单一模块的共享库。现在的现代链接器已经默认采用更合理的模块化架构,这个参数完全失去作用,因此被标记为过时。ld: warning: -multiply_defined is obsolete
该参数原本用于指定链接器遇到重复定义符号时的处理逻辑(比如忽略重复或直接报错)。如今链接器已经通过-warn_multiple_definition这类新参数替代了它的功能,旧参数自然被废弃。
要不要关注这些警告?
完全不用紧张——这些只是链接器的参数过时提示,不会影响你生成的testing.so文件的功能,你已经成功编译出目标文件,说明核心编译逻辑没有问题。
如果只是临时测试代码,直接忽略警告即可;要是你追求干净的编译输出,或者担心未来MacOS版本彻底移除这些参数导致编译失败,再考虑处理也不迟。
如何消除警告?
这些过时参数是R的SHLIB工具链自动添加的,你可以通过修改R的编译配置解决:
- 先在R环境中运行
Sys.getenv("SHLIB_LDFLAGS"),查看当前默认的链接器参数 - 在用户目录下创建或修改
.R/Makevars文件,添加一行:
这行代码的作用是覆盖掉过时的参数。另外,升级到最新版本的R也是可行方案,新版本的R通常会适配系统的新工具链,可能已经移除了这些过时参数。SHLIB_LDFLAGS = $(SHLIB_LDFLAGS) -Wl,-no_single_module,-no_multiply_defined
内容的提问来源于stack exchange,提问作者battousai1983
相关产品推荐
相关产品推荐

