macOS链接静态库报ld相同架构忽略警告 Ubuntu环境可正常运行
问题产生原因
- 首要原因是macOS平台默认提供的
ar为BSD版本,和Ubuntu使用的GNUar生成的静态库索引格式不兼容。你使用ar rcs命令生成的静态库索引结构无法被macOS原生链接器ld正确识别,就会抛出这个架构显示匹配但实际忽略库的矛盾警告。 - 若你的macOS环境中安装了GNU Binutils包,调用的
ar实际为GNU版本,生成的静态库遵循GNU格式,也会出现原生ld无法解析的问题。 - 少部分场景下,编译目标文件时指定的macOS最低兼容版本、架构子参数和最终链接时的参数不一致,也会触发该警告。
可行解决方案
- 方案一:生成静态库后额外执行
ranlib libXXXX.a命令,手动刷新静态库的索引为macOS链接器可识别的格式,大部分场景下可直接解决问题。 - 方案二:使用macOS原生的
libtool工具生成静态库,替换原有的ar命令,命令格式为:
该工具生成的静态库完全适配macOS原生编译链,不会出现兼容问题。libtool -static -o libXXXX.a obj1.o obj2.o ... - 方案三:跨平台编译场景下,可在macOS的编译脚本中指定使用原生BSD ar的绝对路径执行生成操作,避免调用到GNU版本的
ar:/usr/bin/ar rcs libXXXX.a obj1.o obj2.o ... - 方案四:若为参数不一致导致的问题,可在所有目标文件编译、最终链接的命令中统一添加
-arch x86_64参数,强制对齐架构配置:# 编译目标文件时添加 gcc -g -Wall -Wextra -arch x86_64 -c xxx.c -o xxx.o # 最终链接时添加 gcc -g -Wall -Wextra -arch x86_64 main.c -L./dist -lXXXX -o main
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

