iOS(arm64) Clang编译添加-shared参数触发Exec format错误问询
问题核心原因
-shared是链接器用于生成*动态共享库(dylib)*的参数,而非用于生成可执行文件的参数。无论编译主机是x86_64还是arm64架构,添加该参数后生成的产物都不是可执行二进制,系统无法直接识别运行,因此会抛出Exec format error报错。- 该问题和编译主机、目标设备的架构差异完全无关。你可以通过
file hello命令验证两种编译参数的产物差异:- 不加
-shared的输出为:Mach-O 64-bit executable arm64(标准可执行文件) - 加
-shared的输出为:Mach-O 64-bit dynamically linked shared library arm64(动态库文件)
- 不加
常见误区说明
你可能混淆了「链接系统共享框架」和「生成共享库」的参数逻辑:
- 要链接系统提供的共享框架(如CoreMedia),只需要在LDFLAGS中添加
-framework CoreMedia即可,clang会自动处理和系统动态库的链接逻辑,完全不需要额外加-shared。 -shared仅在你需要封装自定义动态库给其他可执行文件/动态库链接时才需要使用,动态库本身不支持直接通过./文件名的方式执行,如果你确实需要运行动态库中的逻辑,需要通过dlopen加载库后调用对应符号,或是将动态库集成到App包中随App运行加载。
额外说明
不需要在arm64平台上编译才能实现链接共享框架的需求,你当前去掉-shared的编译脚本已经是正确可用的跨架构编译配置。
内容的提问来源于stack exchange,提问作者deevee
相关产品推荐
相关产品推荐

