Mac系统C++程序加载错误:dyld无法识别load command 0x80000034
问题与解决:Mac低版本系统无法加载编译程序
问题描述
在Mac OS 13.4.1系统上用CMake编译的C++程序,在Mac OS 10.14.6的Intel Mac上运行时出现错误:
dyld: cannot load 'my_program' (load command 0x80000034 is unknown)
二进制文件依赖信息:
otool -L my_program my_program: /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1500.65.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.100.3)
二进制文件关键加载命令详情:
otool -l my_program # ... 省略非关键内容 ... Load command 5 cmd LC_DYLD_CHAINED_FIXUPS cmdsize 16 dataoff 20594688 datasize 25456 # ... 省略非关键内容 ... Load command 11 cmd LC_BUILD_VERSION cmdsize 32 platform 1 minos 13.0 sdk 13.3 ntools 1 tool 3 version 857.1 # ... 省略非关键内容 ...
错误原因
- 不兼容的加载命令:错误中的
load command 0x80000034对应LC_DYLD_CHAINED_FIXUPS,该命令是Mac OS 11.0(Big Sur)才引入的新链接格式,Mac OS 10.14.6(Mojave)的dyld完全不识别这个命令,导致加载失败。 - 最低系统版本设置过高:从
LC_BUILD_VERSION信息可见,编译时指定了最低支持系统版本为minos 13.0,远高于用户的10.14.6,直接限制了程序在低版本系统上的运行。
解决方案
1. 调整CMake编译参数
在CMake配置阶段,设置最低支持的Mac OS版本为10.14:
cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 ..
或者在CMakeLists.txt中添加:
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.14" CACHE STRING "Minimum OS X deployment version")
2. 使用经典链接器模式
强制编译器使用旧的链接格式,避免生成新的加载命令:
在CMake中添加链接器参数:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-ld_classic")
或者编译时直接指定:
g++ -o my_program source.cpp -mmacosx-version-min=10.14 -Wl,-ld_classic
3. 验证依赖兼容性
当前链接的系统库均满足10.14.6的兼容性要求:
- OpenCL框架在10.14上默认存在,兼容性版本1.0.0符合要求
- libc++.1.dylib和libSystem.B.dylib的兼容性版本均为1.0.0,10.14系统自带版本可满足运行需求
内容的提问来源于stack exchange,提问作者Fractale
相关产品推荐
相关产品推荐

